Boost.Thread 3.0.0 中的重大变化
Posted
技术标签:
【中文标题】Boost.Thread 3.0.0 中的重大变化【英文标题】:Breaking changes in Boost.Thread 3.0.0 【发布时间】:2012-07-08 18:51:21 【问题描述】:在 Boost 库 1.50.0 版的发行说明中,我注意到了两个重大更改 (see here):
#6266 重大更改:线程析构函数应在可连接时调用终止。
#6269 重大更改:如果可连接,线程移动分配应调用终止。
这对我目前使用 Boost 1.49.0 的现有项目意味着什么?我需要改变什么吗?如果是,我需要具体改变什么?如果我忘记修改现有项目之一会怎样?我会遇到编译时错误(我希望如此)还是会遇到令人讨厌且难以发现的运行时问题(我绝对不希望如此)?
【问题讨论】:
【参考方案1】:当它说“重大变化”时,它的意思是,“如果你依赖的行为以前是 X,但现在是 Y,那么你的程序就坏了”。
对于给定的两个更改,这意味着如果您依赖析构函数或移动赋值调用 join()
(或 detach()
),我认为这是以前的行为,您的程序现在必须显式地 join()
或 @ 987654324@ 或认识你的朋友std::terminate()
。这不是编译时错误,但也不是不可预测的运行时行为——你会得到一个很好的干净的崩溃,直接返回到boost::thread
的析构函数,这就是问题的原因。
【讨论】:
请注意,如果可加入,它会调用终止,也就是说,如果线程对象之前没有加入但已分离,它不会终止。 是的,我忘了detach()
。【参考方案2】:
以下代码过去可以正常工作,但在 v3 中,程序将在 t
离开其范围时中止,因为 thread::~thread
调用 std::terminate
,而不是静默地从线程中分离:
#include <boost/thread.hpp>
#include <iostream>
void f()
int main()
boost::thread t(f);
std::cout << "exiting gracefully" << std::endl;
【讨论】:
以上是关于Boost.Thread 3.0.0 中的重大变化的主要内容,如果未能解决你的问题,请参考以下文章
Apache Kafka 3.0.0 稳定版发布,有哪些值得关心的变化?
Qt应用程序中的c ++ boost::thread() - 错误:函数参数过多