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() - 错误:函数参数过多

循环中的Boost Thread_Group非常慢

Boost.Thread 链接 - boost_thread 与 boost_thread-mt

Boost.Thread 还是只是::thread?

boost::thread & 成员函数