我最近设法使用boost :: bind函数创建了一个线程。
目前,我正在向stdout显示线程。如果我使用thread.join,我可以看到输出。但是,如果我不这样做,我看不到任何输出。
这是为什么?
我希望我不必使用join函数,因为我想多次调用这个函数,而不必等待先前启动的线程完成。
感谢您的回复。我真正想要确定的是线程实际执行了。所以我添加了一个系统调用来触摸一个不存在的文件,然后它就在那里,所以线程确实执行了。
答案 0 :(得分:3)
如果我使用thread.join,我可以看到输出。但是,如果我不这样做,我看不到任何输出。为什么是这样?
这很可能是标准输出在系统上缓冲的副作用。您是否在每个打印声明中都散布了'\n'
和/或endl
?这应该强制输出(endl
将另外刷新流。)
如果查看join
的文档,您会看到调用此函数等到线程终止。当一个线程被终止(或者就此而言,一个进程)时,所有缓冲的输出都被刷新。
您不需要等到线程完成执行才能看到输出。至少有几种方法(我记得很清楚)你可以做到这一点:
cout
/ stdout
无缓冲,或\n
和fflush(stdout)
(对于C风格的I / O)或std::endl
流操纵器答案 1 :(得分:3)
默认情况下,线程对象的析构函数不会加入主线程,可能是主线程在线程设法刷新其输出之前终止并关闭STDOUT吗?
请注意,在C ++ 0x中,线程的默认析构函数加入(而不是像在boost中那样分离),所以这不会发生(参见A plea to reconsider detach-on-destruction for thread objects)。
注意:自编写本文以来,C ++ 11标准已更改,未加入的线程现在终止了该过程。