ПрограммированиеФорумОбщее

Усыпление/пробуждение потока

Страницы: 1 2 3 4 5 Следующая »
#0
21:35, 6 окт 2010

Везде очень не рекомендуют юзать SuspendThread/ResumeThread по ряду причин, и рекомендуют использовать свои собственные механизмы... Как правильно усыпить поток и потом его резумить собственными силами?
Способы аля вечный цикл не гуд...

#1
21:39, 6 окт 2010

Executor
> Везде очень не рекомендуют юзать SuspendThread/ResumeThread по ряду причин

Может врут? Аргументация таки какая?

>Как правильно усыпить поток и потом его резумить собственными силами?

Можно заюзать CreateEvent/ResetEvent/WaitForSingleObject/SetEvent - если речь про WinApi.

#2
21:40, 6 окт 2010

boost::thread -> stop, join()
вообще гугли на тему "boost suspend thread"

#3
21:48, 6 окт 2010

oistalker
> Может врут? Аргументация таки какая?
поток может захватить важный ресурс, что может привести к дедлокам...

семафоры/евенты/критические секции - то что нужно для выполнения данной задачи...

kvakvs
> boost::thread -> stop, join()
средства другие, проблемы те же...

#4
21:50, 6 окт 2010

oistalker
> Может врут? Аргументация таки какая?
Та не, не врут, как минимум квантизация процессорного времени неисповедима, отсюда можно нахватить потенциальную проблему, в основном из-за этого и не рекомендуют.
kvakvs
> boost::thread -> stop, join()
А там внутри и так бесконечный цыкл со слипом по сути.

#5
21:51, 6 окт 2010

Executor
> Способы аля вечный цикл не гуд...
вообще-то гуд во многих случаях, в частности спин блокировки

#6
21:56, 6 окт 2010

потоки не спят, потоки ждут

#7
21:59, 6 окт 2010

oistalker
> Можно заюзать CreateEvent/ResetEvent/WaitForSingleObject/SetEvent
+1

#8
22:00, 6 окт 2010

Executor, вообщем все способы блокировки потока можно свести к 2-ум, к тем что переключают поток из пользовательского режима в режим ядра и обратно, и те что не переключают. Переключение работает долго, потому если блокируемый участок кода, или вообще время на которое нужно паузить поток, - мало, то нужно использовать блокировки без переключений, например спин блокировка (аля цикл со слипом)
когда какую из этих 2-ух разновидностей блокировок использовать уже решил, то все остальные подтипы не имеют значения, выбирай любую которая тебе более удачно подходит, в зависимости от задачи, часто в некоторых блокировках используется короткая спин блокировка, а потом переход в режим ядра

#9
22:01, 6 окт 2010

Гопник Хаскель
> потоки не спят, потоки ждут
Если юзать именно SuspendThread/ResumeThread, то там как-раз термин "спят" больше подходит.

#10
22:14, 6 окт 2010

kvakvs
Буст не нужен... :)

oistalker
> Можно заюзать CreateEvent/ResetEvent/WaitForSingleObject/SetEvent - если речь про WinApi.

Pushkoff
> семафоры/евенты/критические секции - то что нужно для выполнения данной задачи...

Ну это как я понимаю в главном потоке заставить ждать нужный поток? Это не то...
Мне не нужно ждать, поток может и через час, и через день только проснуться...
Просто надо усыпить и пусть спит до лучших времён, пока я не посчитаю нужным его разбудить...

ashujon
> вообще-то гуд во многих случаях, в частности спин блокировки

Ну уж точно не для усыпления потока...
Мне не нужна спин-блокировка - напрасная трата ресурсов процессора... (в контексте темы)

ashujon
> Executor, вообщем все способы блокировки потока можно свести к 2-ум, к тем что
> переключают поток из пользовательского режима в режим ядра и обратно, и те что
> не переключают. Переключение работает долго, потому если блокируемый участок
> кода, или вообще время на которое нужно паузить поток, - мало, то нужно
> использовать блокировки без переключений, например спин блокировка (аля цикл со
> слипом)

Ну это уже не усыпление, а ожидание потоком волшебного пенделя...

#11
22:17, 6 окт 2010

Executor

>Ну это как я понимаю в главном потоке заставить ждать нужный поток?

Нет как бы,  - поток сам засыпает  вызове WaitForSingleObject, ожидая перехода события в сигнальное положение.

> Мне не нужно ждать, поток может и через час, и через день только проснуться...

Пошлешь SetEvent через год, - через год и проснется

#12
22:18, 6 окт 2010

oistalker
А, понял... Попробую с таким вариантом...

#13
22:22, 6 окт 2010

Вот например в книжке написано:

"Создавая реальное приложение, будьте осторожны с вызовами SuspendThread, так как нельзя заранее сказать, чем будет заниматься его поток в момент приостановки. Например, он пытается выделить память из кучи и поэтому заблокировал к ней доступ. Тогда другим потокам, которым тоже нужна динамическая память, придется ждать его возобновления."

В случае с WaitForSingleObject я могу попасть в такую же ситуацию?

#14
22:26, 6 окт 2010

Executor
> Мне не нужно ждать, поток может и через час, и через день только проснуться...
> Просто надо усыпить и пусть спит до лучших времён, пока я не посчитаю нужным
> его разбудить...
а поток выполняет циклические действия?
если да - создаешь событие EvtProcess к примеру, и бул переменную volatile Sleep, и каждую итерацию в потоке { if(Sleep) WaitForSingleObject(EvtProcess, INFINITE); }, а усыпляешь поток методом { ResetEvent(EvtProcess);  Sleep = true; }, запускаешь { Sleep = false; setEvent(EvtProcess); } типо того
если нет - то ты четко знать где остановится поток не можешь, а потому SuspendThread/ResumeThread
> В случае с WaitForSingleObject я могу попасть в такую же ситуацию?
нет, поток вызывая WaitForSingleObject по определению не может быть занят выделением памяти или чем-либо еще

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.