Когда использовать функцию объединения потоков Boost?

Недавно мне удалось создать поток с помощью функции boost::bind.

В настоящее время у меня отображается поток на стандартный вывод. Я вижу результат, если использую thread.join. Однако, если я этого не сделаю, я не увижу никакого результата.

Почему это?

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

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


person Jack BeNimble    schedule 28.04.2009    source источник
comment
Это может помочь показать пример кода. Я предполагаю, что ваш main() может выйти до того, как ваш поток сможет распечатать. Вызов join заставляет main ждать завершения потока.   -  person dubnde    schedule 28.04.2009


Ответы (2)


Я вижу результат, если использую thread.join. Однако, если я этого не сделаю, я не увижу никакого результата. Почему это?

Скорее всего, это побочный эффект буферизации стандартного вывода в вашей системе. У вас есть '\n' и/или endl в каждом операторе печати? Это должно вызвать вывод (endl дополнительно сбрасывает поток).

Если вы посмотрите документацию для join вы увидите, что эта функция вызывается для ожидания завершения потока. Когда поток завершается (или, если уж на то пошло, процесс), весь буферизованный вывод сбрасывается.

Вам не нужно ждать, пока поток завершит выполнение, чтобы увидеть вывод. Есть по крайней мере несколько способов (я помню с головы), вы можете добиться этого:

  • Сделать cout/stdout небуферизованными или
  • Используйте \n и fflush(stdout) (для ввода-вывода в стиле C) или std::endl манипулятор потока
person dirkgently    schedule 28.04.2009
comment
Возможно, вам следует перефразировать вызов, чтобы завершить поток. join не завершает поток, а заставляет текущий поток ждать того, для которого был вызван метод соединения. О чем, я уверен, вы знаете. - person Skurmedel; 28.04.2009
comment
подождите, пока тот, к которому был вызван метод соединения, завершится. (ТАК нужна кнопка редактирования комментария.) - person Skurmedel; 28.04.2009

По умолчанию деструктор объекта потока не присоединяется к основному потоку, может быть, ваш основной поток завершается и закрывает STDOUT до того, как поток успевает сбросить свой вывод?

Обратите внимание, что в C++0x деструктор потока по умолчанию выполняет присоединение (а не отсоединение, как в boost), поэтому этого не произойдет (см. Призыв пересмотреть отсоединение при уничтожении для объектов потока).

Примечание. С тех пор как это было написано, стандарт C++11 был изменен, и теперь несвязанный поток завершает процесс.

person Motti    schedule 28.04.2009
comment
В C++0x деструктор потока не присоединяется. Если поток все еще может быть присоединен при уничтожении, тогда среда выполнения вместо этого завершит ваше приложение. - person typ1232; 03.06.2013