Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Многопоточность, вызов функции, её аргументы


Автор: EnergoHokum 8.11.2007, 15:51
Кратко о задаче: Есть цикл с фиксированным количеством проходов, в этом цикле некоторая переменная принимает значение, для каждого прохода другое. После этого создаётся поток (::CreateThread(LPVOID lpVoid)), куда я переда. указатель на эту переменную (в потоке она обрабатывается и т. д.). Поток продолжает работать и после окончания цикла, т. е. их будет несколько. Сразу же после создания потока и передачи ему указателя цикл уходит на новую итерацию.
Проблема в том, не случится ли такого, что поток, получивший указатель на переменную N-ной итерации, обращаться будет уже к N+1 (2, 3..)-ей переменной?

Автор: JackYF 8.11.2007, 15:55
Цитата(EnergoHokum @  8.11.2007,  15:51 Найти цитируемый пост)
Проблема в том, не случится ли такого, что поток, получивший указатель на переменную N-ной итерации, обращаться будет уже к N+1 (2, 3..)-ей переменной? 

да, может случится. Передавай переменную по значению, если в 4 байта вложишься.

Автор: EnergoHokum 8.11.2007, 16:03
Не, там много чего передавать нужно... Придумалось так: пакую то, что нужно передавать и какой-нить handle в структуру, отдаю указатель на неё потоку а в основной программе жду, когда поток установит handle в сигнальное состояние. Костыляндия, конечно, но пока ничего более другого smile в голову не приходит...

Автор: Alek86 8.11.2007, 16:19
в винапи именно для этого используются события.

и вообще рекомендую прочесть про примитивы синхронизации
Event, Semaphore, Timer...

и функции
WaitForSingleObject и WaitForMultiplyObjects

если ты не начинающий и тебе нужна кросс- программа, то в бусте есть библиотека Threads, кажись

Автор: vladimir_ad 8.11.2007, 16:21
Цитата(EnergoHokum @  8.11.2007,  15:51 Найти цитируемый пост)
в этом цикле некоторая переменная принимает значение, для каждого прохода другое. После этого создаётся поток (::CreateThread(LPVOID lpVoid)), куда я переда. указатель на эту переменную 

Ты передаешь указатель на переменную всем потокам один итотже smile 
Если потоки должны работать с собственными данными делай для каждого потока свой буфер и передавай на него указатель.


Автор: Alek86 8.11.2007, 16:27
а если данные огромные?
все он правильно делает, просто надо работу потоков синхронизировать и все

Автор: vladimir_ad 8.11.2007, 16:28
Цитата(Alek86 @  8.11.2007,  16:19 Найти цитируемый пост)
и вообще рекомендую прочесть про примитивы синхронизации

Вероятно EnergoHokum это и имел ввиду под выражением 
Цитата(EnergoHokum @  8.11.2007,  16:03 Найти цитируемый пост)
и какой-нить handle 

Однако непонятно его недовольство.

Автор: EnergoHokum 8.11.2007, 16:28
Ну да, через события это и сделал. Вроде должно работать, как задумано smile Компиляция и запуск расставят всё по местам...

Автор: vladimir_ad 8.11.2007, 16:31
Цитата(Alek86 @  8.11.2007,  16:27 Найти цитируемый пост)
а если данные огромные?
все он правильно делает,

А что он привильно делает? Передает указатель на одну переменную в несколко потоков?

Он сам сказал "в этом цикле некоторая переменная принимает значение, для каждого прохода другое. "

Автор: EnergoHokum 8.11.2007, 16:40
Я после передачи handle, инициализированного Event-ом потоку, жду, когда он его освободит. Освободит он его только после того, как перепишет себе все переменные, которые в создающем потоке на следующей итерации изменятся. Немного путано получилось...

Автор: vladimir_ad 8.11.2007, 17:56
Ага. Я так понял:
В цикле ты получаешь данные размещенные в буфере;
Далее создаешь поток и передаешь ему указатель на буфер;
Полученный поток (умный) создает копию буфера, сообщает о завершении копирования через Event;

если да то:
в цикле выделяем память под буфер, копируем;
создаем поток и передаем ему указатель на новый буфер;
в потоке по мере необходимости управляем буфером и удаляем его.

ждать ничего не нужно.


Автор: EnergoHokum 8.11.2007, 18:40
Хм, тоже вариант, пожалуй, и лучше событий будет... Попробую.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)