在Boost库1.50.0版的发行说明中,我注意到两个重大变化(see here):
#6266中断更改:如果可连接,则线程析构函数应调用terminate。
#6269中断更改:如果可连接,则线程移动分配应调用terminate。
这对我目前使用Boost 1.49.0的现有项目意味着什么?我需要改变什么吗?如果是的话,我该怎么做才能完全改变?如果我忘记修改我现有的一个项目会怎样?我是否会遇到编译时错误(我希望如此)或者我是否会遇到令人讨厌且难以发现的运行时问题(我绝对不希望如此)?
答案 0 :(得分:7)
当它说“突然改变”时,它意味着,“如果你依赖于以前的X行为,你的程序就会被打破,但现在是Y”。
对于给定的两个更改,这意味着如果您依赖析构函数或移动调用join()
(或detach()
)的作业,我认为这是以前的行为,您的程序现在必须显式{ {1}}或join()
或与您的朋友detach()
见面。这不是一个编译时错误,但也不是不可预测的运行时行为 - 你会得到一个很好的干净崩溃,直接回到std::terminate()
的析构函数,这是导致问题的原因。
答案 1 :(得分:7)
以下代码用于正常工作,但是对于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;
}