Когда следует использовать функцию объединения потоков Boost? - PullRequest
3 голосов
/ 28 апреля 2009

Мне недавно удалось создать поток, используя функцию boost :: bind.

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

Почему это?

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

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

Ответы [ 2 ]

3 голосов
/ 28 апреля 2009

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

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

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

3 голосов
/ 28 апреля 2009

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

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

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

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

  • Сделать cout / stdout небуферизованным или
  • Используйте \n и fflush(stdout) (для ввода-вывода в стиле C) или std::endl потоковый манипулятор
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...