Boost.Threads
как реализовать следующий шаблон:
1. Основной поток запускает новый, выполняющий некоторую работу за конечное время.
2. при завершении работы потока (возможен также вариант принудительного останова из основного потока) основной должен быть оповещен и выполнить некоторые действия.
Как сделать все на boost, я не сообразил, пришлось прибегнуть к виндузовым функциям отправки сообщений (PostMessage), что очень-очень не желательно в смысле переносимости кода.
PostMessage я использовал для оповещения основного потока о ходе работы (в этот момент основной должен "снимать" подсчитанные данные) и завершении.
Я, честно говоря, тоже не особо разбирался в boost::thread, но под виндой я оповещал основной поток с помощью Event (см. CreateEvent), основной поток собственно ждал это событие (см. WaitForSingleObject, WaitForMultipleObjects, MsgWaitForMultipleObjects). В свою очередь, запущенный поток может периодически проверять другой Event, означающий то, что основной поток хочет отменить действие.
Думаю, в boost если даже нет такого понятия, как event, его легко эмулировать с помощью boost::разные_мютексы.
Вообщим цель данного топика - описать кроссплатформенный шаблон (скажем на boost).
как реализовать следующий шаблон:
1. Основной поток запускает новый, выполняющий некоторую работу за конечное время.
2. при завершении работы потока (возможен также вариант принудительного останова из основного потока) основной должен быть оповещен и выполнить некоторые действия.
Как сделать все на boost, я не сообразил, пришлось прибегнуть к виндузовым функциям отправки сообщений (PostMessage), что очень-очень не желательно в смысле переносимости кода.
PostMessage я использовал для оповещения основного потока о ходе работы (в этот момент основной должен "снимать" подсчитанные данные) и завершении.
В бусте все делается достаточно просто... и легко обмениваться сообщениями - можешь сделать очередь, можешь просто флагами... но не забудь при обращении к каким-то переменным из разных потоков использовать мьютексы
Вот тебе пара примеров, если что спрашивай:
volatile bool flag (волатайл не обязателен, но лучше указать, тогда ты точно всегда получишь текущее значение переменной)
boost::mutex myMutex;
чтение переменной:
boost::mutex::scoped_lock lock(myMutex); - в этом случае происходит ожидание разблокировки мьютекса и перехват его
---тут пишешь/читаешь переменную---
---тут освобождаешь мьютекс:
lock.unlock(); или delete &lock;
Или если облать видимости заканчивается, то делать ничего не нужно ;)
Ну и пример запуска из функции класса другой функции этого же класса:
boost::thread t(boost::bind(&MyClass::run_session,this)); --- run_session - это функция
цель данного топика - описать шаблон...и обернуть его идиомой raii.
Я как время найду, набросаю примерчик и залью его на SVN. Совместными усилиями можно будет его довести до приемлемого вида, а потом набросать еще каких-нибудь шаблонов. Думаю пригодятся многим...
http://www.assembla.com/wiki/show/cuP-NsEoWr3iI7abIlDkbG
Предложения, отзывы и прочее оставляйте в разделе Flow, ссылку на рабочую wiki и svn можно найти там же.
>>http://www.assembla.com/wiki/show/cu...Wr3iI7abIlDkbG
>>Предложения, отзывы и прочее оставляйте в разделе Flow, ссылку на рабочую wiki и svn можно найти там же.
НЕТ там ничего по этой ссылке
>>http://www.assembla.com/wiki/show/cu...Wr3iI7abIlDkbG
>>Предложения, отзывы и прочее оставляйте в разделе Flow, ссылку на рабочую wiki и svn можно найти там же.
НЕТ там ничего по этой ссылке
чувак ты на дату поста посмотри, ага?