何时使用 boost 线程连接功能?
Posted
技术标签:
【中文标题】何时使用 boost 线程连接功能?【英文标题】:When to use boost thread join function? 【发布时间】:2009-04-28 05:14:32 【问题描述】:我最近设法使用 boost::bind 函数创建了一个线程。
目前,我正在将线程显示到标准输出。如果我使用 thread.join,我可以看到输出。但是,如果我不这样做,我看不到任何输出。
这是为什么?
我希望我不必使用 join 函数,因为我想多次调用这个函数,而不必等待之前启动的线程完成。
感谢您的回复。我真正想确定的是线程实际执行了。所以我添加了一个系统调用来触摸一个不存在的文件,然后它就在那里,所以线程确实执行了。
【问题讨论】:
展示一些示例代码可能会有所帮助。我猜你的main()
可能会在你的线程打印之前退出。 join
调用使main
等待线程完成。
【参考方案1】:
如果我使用 thread.join,我可以看到输出。但是,如果我不这样做,我看不到任何输出。为什么是这样?
这很可能是标准输出在您的系统上缓冲方式的副作用。你有'\n'
和/或endl
散布在每个打印声明中吗?这应该强制输出(endl
将另外刷新流)。
如果您查看join
的文档,您会看到调用此函数以等待线程终止。当一个线程(或就此而言,一个进程)终止时,所有缓冲的输出都会被刷新。
您无需等到线程完成执行才能查看输出。至少有几种方法(我记得我的头脑)可以实现这一点:
使cout
/stdout
无缓冲,或
使用 \n
和 fflush(stdout)
(用于 C 样式 I/O)或 std::endl
流操作符
【讨论】:
也许你应该改写“被调用来终止一个线程”。 join 不会终止线程,而是使当前线程等待调用 join 方法的线程。我相信你已经知道了。 "等待加入方法被调用的那个终止。" (所以需要一个编辑评论按钮。)【参考方案2】:默认情况下,线程对象的析构函数不加入主线程,是不是你的主线程在线程设法刷新其输出之前终止并关闭了 STDOUT?
请注意,在 C++0x 中,线程的默认析构函数会加入(而不是像 boost 中那样分离),因此不会发生这种情况(请参阅A plea to reconsider detach-on-destruction for thread objects)。
注意:由于这是编写的,因此 C++11 标准已更改,未加入的线程现在终止进程。
【讨论】:
在 C++0x 中,线程的析构函数不会“加入”。如果线程在销毁时仍可加入,则运行时将终止您的应用程序。以上是关于何时使用 boost 线程连接功能?的主要内容,如果未能解决你的问题,请参考以下文章