![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
EnergoHokum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Кратко о задаче: Есть цикл с фиксированным количеством проходов, в этом цикле некоторая переменная принимает значение, для каждого прохода другое. После этого создаётся поток (::CreateThread(LPVOID lpVoid)), куда я переда. указатель на эту переменную (в потоке она обрабатывается и т. д.). Поток продолжает работать и после окончания цикла, т. е. их будет несколько. Сразу же после создания потока и передачи ему указателя цикл уходит на новую итерацию.
Проблема в том, не случится ли такого, что поток, получивший указатель на переменную N-ной итерации, обращаться будет уже к N+1 (2, 3..)-ей переменной? |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
EnergoHokum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Не, там много чего передавать нужно... Придумалось так: пакую то, что нужно передавать и какой-нить handle в структуру, отдаю указатель на неё потоку а в основной программе жду, когда поток установит handle в сигнальное состояние. Костыляндия, конечно, но пока ничего более другого
![]() |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
в винапи именно для этого используются события.
и вообще рекомендую прочесть про примитивы синхронизации Event, Semaphore, Timer... и функции WaitForSingleObject и WaitForMultiplyObjects если ты не начинающий и тебе нужна кросс- программа, то в бусте есть библиотека Threads, кажись |
|||
|
||||
vladimir_ad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
Ты передаешь указатель на переменную всем потокам один итотже ![]() Если потоки должны работать с собственными данными делай для каждого потока свой буфер и передавай на него указатель. |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
а если данные огромные?
все он правильно делает, просто надо работу потоков синхронизировать и все |
|||
|
||||
vladimir_ad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
||||
|
||||
EnergoHokum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Ну да, через события это и сделал. Вроде должно работать, как задумано
![]() |
|||
|
||||
vladimir_ad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
А что он привильно делает? Передает указатель на одну переменную в несколко потоков? Он сам сказал "в этом цикле некоторая переменная принимает значение, для каждого прохода другое. " Это сообщение отредактировал(а) vladimir_ad - 8.11.2007, 16:33 |
|||
|
||||
EnergoHokum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Я после передачи handle, инициализированного Event-ом потоку, жду, когда он его освободит. Освободит он его только после того, как перепишет себе все переменные, которые в создающем потоке на следующей итерации изменятся. Немного путано получилось...
|
|||
|
||||
vladimir_ad |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 7.9.2007 Репутация: нет Всего: нет |
Ага. Я так понял:
В цикле ты получаешь данные размещенные в буфере; Далее создаешь поток и передаешь ему указатель на буфер; Полученный поток (умный) создает копию буфера, сообщает о завершении копирования через Event; если да то: в цикле выделяем память под буфер, копируем; создаем поток и передаем ему указатель на новый буфер; в потоке по мере необходимости управляем буфером и удаляем его. ждать ничего не нужно. |
|||
|
||||
EnergoHokum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Хм, тоже вариант, пожалуй, и лучше событий будет... Попробую.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |