8

在 Boost 库 1.50.0 版的发行说明中,我注意到了两个重大更改(请参见此处):

#6266 重大更改:线程析构函数应在可连接时调用终止。

#6269 重大更改:如果可加入,线程移动分配应调用终止。

这对我目前使用 Boost 1.49.0 的现有项目意味着什么?我需要改变什么吗?如果是,我需要具体改变什么?如果我忘记修改现有项目之一会怎样?我会遇到编译时错误(我希望如此)还是会遇到令人讨厌且难以发现的运行时问题(我绝对不希望如此)?

4

2 回答 2

7

当它说“重大变化”时,它的意思是,“如果你依赖于以前是 X,但现在是 Y 的行为,你的程序就会被破坏”。

对于给定的两个更改,这意味着如果您依赖析构函数或移动赋值调用join()(或detach()),我认为这是以前的行为,您的程序现在必须显式地join()detach()遇到您的朋友std::terminate()。这不是编译时错误,但也不是不可预测的运行时行为——你会得到一个很好的干净崩溃,直接返回到boost::thread's 的析构函数,这是问题的原因。

于 2012-07-09T11:16:03.217 回答
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;
} 
于 2012-07-09T12:27:11.530 回答