Консультация № 133581
22.04.2008, 13:38
0.00 руб.
0 2 2
Здравствуйте эксперты!

Подскажите пжлста как решить следующую проблему:
в параллельном потоке заполняется такой массив:

unsigned int *data;
data = new unsigned int[n*m];
...
// заполняется массив
...
delete data;

Как мне передать этот массив в главный поток, чтобы потом с ним там можно было спокойно
работать?
Заранее спасибо.
CBuilder5.

Обсуждение

Неизвестный
22.04.2008, 14:07
общий
это ответ
Здравствуйте, Муратов Радик Анатольевич!

Я бы на Вашем месте сделал бы так:
Создал бы массив в главном потоке и в параллельный передал бы указатель на него, а так же какую-нибудь глобальную переменную в качестве флага, затем в параллельном потоке, в критической секции заполнил бы массив и установил бы флаг, а в главном потоке проверяя флаг, работал бы с массивом. См. приложение (заранее прошу прощения за возможные ошибки - нет возможности сейчас проверить этот код, пишу его "на коленях").

Приложение:
bool isInitialized;void main(){int array[3];CreateThread(NULL, 0, thread, (LPVOID)*array, NULL, 0);....if(isInitialized){//Work with array}}void thread(LPVOID p){int[] array = (int[])p;//feel arrayisInitialized = true;}
Неизвестный
23.04.2008, 04:28
общий
это ответ
Здравствуйте, Муратов Радик Анатольевич!
Вернуть напрямую значение из потока не получится, т.к. функция ThreadProc имеет возвращаемый параметр типа DWORD, что не подходит. Но в поток передается параметр, и именно через него можно передать указатель на ваш массив. Т.е. в параллельном потоке создается массив и через параметр передаваемый в функцию потока, возвращается в главный поток. Память выделенную в паралелльном потоке нужно будет освобождать в главном.

Приложение:
#include <stdio.h>#include <windows.h>int size = 10;DWORD WINAPI create_and_fill_array(LPVOID param) { int *a = new int[size]; for(int i=0; i<size; i++) a[i] = i*i; int **ret = (int **)param; *ret = a; return 0;}int main(int argc, char* argv[]) { int *a; HANDLE thread = CreateThread(NULL, 0, create_and_fill_array,(LPVOID)&a, 0, NULL); ::WaitForSingleObject(thread, INFINITE); printf("Array a filled in thread\n"); for(int i=0; i<size; i++) printf("%d ", a[i]); printf("\n"); delete[] a; return 0;}
Форма ответа