何时使用boost thread join功能?

时间:2009-04-28 05:14:32

标签: c++ boost join

我最近设法使用boost :: bind函数创建了一个线程。

目前,我正在向stdout显示线程。如果我使用thread.join,我可以看到输出。但是,如果我不这样做,我看不到任何输出。

这是为什么?

我希望我不必使用join函数,因为我想多次调用这个函数,而不必等待先前启动的线程完成。

感谢您的回复。我真正想要确定的是线程实际执行了。所以我添加了一个系统调用来触摸一个不存在的文件,然后它就在那里,所以线程确实执行了。

2 个答案:

答案 0 :(得分:3)

  

如果我使用thread.join,我可以看到输出。但是,如果我不这样做,我看不到任何输出。为什么是这样?

这很可能是标准输出在系统上缓冲的副作用。您是否在每个打印声明中都散布了'\n'和/或endl?这应该强制输出(endl将另外刷新流。)

如果查看join的文档,您会看到调用此函数等到线程终止。当一个线程被终止(或者就此而言,一个进程)时,所有缓冲的输出都被刷新。

您不需要等到线程完成执行才能看到输出。至少有几种方法(我记得很清楚)你可以做到这一点:

  • 使cout / stdout无缓冲,或
  • 使用\nfflush(stdout)(对于C风格的I / O)或std::endl流操纵器

答案 1 :(得分:3)

默认情况下,线程对象的析构函数不会加入主线程,可能是主线程在线程设法刷新其输出之前终止并关闭STDOUT吗?

请注意,在C ++ 0x中,线程的默认析构函数加入(而不是像在boost中那样分离),所以这不会发生(参见A plea to reconsider detach-on-destruction for thread objects)。

注意:自编写本文以来,C ++ 11标准已更改,未加入的线程现在终止了该过程。