何时使用 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 无缓冲,或 使用 \nfflush(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 线程连接功能?的主要内容,如果未能解决你的问题,请参考以下文章

使用 libevent 或 boost::asio 的单线程中的多个 tcp 连接。这是可能的?

关于何时在 Boost.Asio 中调用处理程序

检测何时将对象传递给 C++ 中的新线程?

从 boost::signals2 安全断开

DBCP2 - 何时从池中删除空闲连接

Boost.Thread 3.0.0 中的重大变化