| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Многопоточность, вызов функции, её аргументы |
| Автор: EnergoHokum 8.11.2007, 15:51 |
| Кратко о задаче: Есть цикл с фиксированным количеством проходов, в этом цикле некоторая переменная принимает значение, для каждого прохода другое. После этого создаётся поток (::CreateThread(LPVOID lpVoid)), куда я переда. указатель на эту переменную (в потоке она обрабатывается и т. д.). Поток продолжает работать и после окончания цикла, т. е. их будет несколько. Сразу же после создания потока и передачи ему указателя цикл уходит на новую итерацию. Проблема в том, не случится ли такого, что поток, получивший указатель на переменную N-ной итерации, обращаться будет уже к N+1 (2, 3..)-ей переменной? |
| Автор: EnergoHokum 8.11.2007, 16:03 |
| Не, там много чего передавать нужно... Придумалось так: пакую то, что нужно передавать и какой-нить handle в структуру, отдаю указатель на неё потоку а в основной программе жду, когда поток установит handle в сигнальное состояние. Костыляндия, конечно, но пока ничего более другого |
| Автор: Alek86 8.11.2007, 16:19 |
| в винапи именно для этого используются события. и вообще рекомендую прочесть про примитивы синхронизации Event, Semaphore, Timer... и функции WaitForSingleObject и WaitForMultiplyObjects если ты не начинающий и тебе нужна кросс- программа, то в бусте есть библиотека Threads, кажись |
| Автор: vladimir_ad 8.11.2007, 16:21 | ||
Ты передаешь указатель на переменную всем потокам один итотже Если потоки должны работать с собственными данными делай для каждого потока свой буфер и передавай на него указатель. |
| Автор: Alek86 8.11.2007, 16:27 |
| а если данные огромные? все он правильно делает, просто надо работу потоков синхронизировать и все |
| Автор: vladimir_ad 8.11.2007, 16:28 |
Вероятно EnergoHokum это и имел ввиду под выражением Однако непонятно его недовольство. |
| Автор: EnergoHokum 8.11.2007, 16:28 |
| Ну да, через события это и сделал. Вроде должно работать, как задумано |
| Автор: vladimir_ad 8.11.2007, 16:31 |
А что он привильно делает? Передает указатель на одну переменную в несколко потоков? Он сам сказал "в этом цикле некоторая переменная принимает значение, для каждого прохода другое. " |
| Автор: EnergoHokum 8.11.2007, 16:40 |
| Я после передачи handle, инициализированного Event-ом потоку, жду, когда он его освободит. Освободит он его только после того, как перепишет себе все переменные, которые в создающем потоке на следующей итерации изменятся. Немного путано получилось... |
| Автор: vladimir_ad 8.11.2007, 17:56 |
| Ага. Я так понял: В цикле ты получаешь данные размещенные в буфере; Далее создаешь поток и передаешь ему указатель на буфер; Полученный поток (умный) создает копию буфера, сообщает о завершении копирования через Event; если да то: в цикле выделяем память под буфер, копируем; создаем поток и передаем ему указатель на новый буфер; в потоке по мере необходимости управляем буфером и удаляем его. ждать ничего не нужно. |
| Автор: EnergoHokum 8.11.2007, 18:40 |
| Хм, тоже вариант, пожалуй, и лучше событий будет... Попробую. |