在 Boost 库 1.50.0 版的发行说明中,我注意到了两个重大更改(请参见此处):
#6266 重大更改:线程析构函数应在可连接时调用终止。
#6269 重大更改:如果可加入,线程移动分配应调用终止。
这对我目前使用 Boost 1.49.0 的现有项目意味着什么?我需要改变什么吗?如果是,我需要具体改变什么?如果我忘记修改现有项目之一会怎样?我会遇到编译时错误(我希望如此)还是会遇到令人讨厌且难以发现的运行时问题(我绝对不希望如此)?
在 Boost 库 1.50.0 版的发行说明中,我注意到了两个重大更改(请参见此处):
#6266 重大更改:线程析构函数应在可连接时调用终止。
#6269 重大更改:如果可加入,线程移动分配应调用终止。
这对我目前使用 Boost 1.49.0 的现有项目意味着什么?我需要改变什么吗?如果是,我需要具体改变什么?如果我忘记修改现有项目之一会怎样?我会遇到编译时错误(我希望如此)还是会遇到令人讨厌且难以发现的运行时问题(我绝对不希望如此)?
当它说“重大变化”时,它的意思是,“如果你依赖于以前是 X,但现在是 Y 的行为,你的程序就会被破坏”。
对于给定的两个更改,这意味着如果您依赖析构函数或移动赋值调用join()
(或detach()
),我认为这是以前的行为,您的程序现在必须显式地join()
或detach()
遇到您的朋友std::terminate()
。这不是编译时错误,但也不是不可预测的运行时行为——你会得到一个很好的干净崩溃,直接返回到boost::thread
's 的析构函数,这是问题的原因。
以下代码过去可以正常工作,但在 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;
}