Как я узнаю, что продвижение сделано? - PullRequest
4 голосов
/ 10 мая 2010

Я использую boost :: thread для обработки сообщений в очереди. Когда приходит первое сообщение, я запускаю поток обработки сообщений. Когда приходит второе сообщение, я проверяю, завершен ли поток обработки сообщения.

если это сделано, я начинаю новый если это не сделано, я ничего не делаю.

Как узнать, закончена ли тема? Я пытался с joinable (), но он не работает, так как, когда поток завершен, он все еще присоединяемый.

Я также пытался сразу прервать процесс и добавить точку прерывания в конце моего потока, но это не сработало.

Спасибо

РЕДАКТИРОВАТЬ:

Я бы хотел, чтобы мой поток спал в течение неопределенного времени и просыпался при срабатывании сигнала.

Смысл сделать это - boost :: condition_variable

Ответы [ 3 ]

2 голосов
/ 10 мая 2010

Насколько я знаю, вы должны использовать метод join (), чтобы дождаться окончания выполнения потока. Вы можете использовать его с таймаутом с помощью timed_join ().

Вы можете прерывать потоки с помощью interrupt (). В этом случае внутри потока произойдет исключение, если выполнение достигает точки прерывания (boost :: this_thread :: sleep () или boost :: this_thread :: interrupt_point ()). Вы ловите исключение внутри потока и можете закрыть его.

1 голос
/ 11 мая 2010

Создание нового потока для каждого входящего сообщения очень неэффективно. Вы должны проверить шаблон пула потоков .

EDIT:

Извините, Джулс, я неправильно понял ваш вопрос. Я рекомендую вам взглянуть на шаблон производитель-потребитель . Прочтите эту статью о том, как создать собственную очередь блокировки с использованием переменных условия повышения. У Intel Building Blocks также есть реализация очереди блокировки.

Проверьте этот вопрос SO о существующих реализациях очереди без блокировки.

Надеюсь, это поможет.

0 голосов
/ 10 мая 2010

Вы пытались проверить get_id () с boost :: this_thread :: get_id (). Если они совпадают, поток не существует. Но это произойдет только в том случае, если вы вышли из потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...