2012-07-09 57 views
8

在Boost库的1.50.0版本发行说明重大更改我注意到有两个重大的变动(see here):在Boost.Thread 3.0.0

#6266最新变化:螺纹析构函数应该调用终止如果可以连接。

#6269重大变化:如果可连接,则线程移动分配应该调用终止。

这对我目前使用Boost 1.49.0的现有项目意味着什么?我需要改变什么吗?如果是的话,我需要做什么改变?如果我忘记修改我现有的一个项目,会发生什么?我会得到编译时错误(我希望如此)还是会得到讨厌和难以找到的运行时问题(我绝对不希望如此)?

回答

7

当它说“突变”时,它表示“如果您以前的行为是X,但现在是Y,您的程序就会中断”。

对于给定的两个变化,这意味着如果你依赖析构函数或移动分配调用join()(或detach()),我相信是以前的行为,你的程序现在必须明确join()detach()或满足您的朋友std::terminate() 。这不是一个编译时错误,但它也不是一个不可预测的运行时行为 - 你会得到一个很好的干净的崩溃,导致回到boost::thread的析构函数,这是造成问题的原因。

+1

注意,它调用终止如果可连接,那么它将不会终止,如果线程对象先前未被连接但被分离。 – PlasmaHH 2012-07-09 11:22:35

+1

是的,我忘了'detach()'。 – Puppy 2012-07-09 15:47:33

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; 
} 
相关问题