为什么boost :: thread的析构函数分离可连接线程而不是标准调用terminate()?

时间:2011-05-03 19:17:09

标签: c++ multithreading c++11 boost-thread standards-compliance

根据草案C ++ 0x标准,此代码:

void simplethread()
{
    boost::thread t(someLongRunningFunction);
    // Commented out detach - terminate() expected.
    // t.detach();  
}

...应该导致terminate()调用,但是在当前(boost 1.46.1)boost线程的实现中它没有,线程只是在析构函数中分离并继续。

我的问题是:为什么?

我认为boost :: thread与草案标准一样多。

这有设计理由吗? 它会在未来版本的boost :: thread中改变吗?

1 个答案:

答案 0 :(得分:24)

原因主要是历史性的。 boost::thread排在第一位。 std::thread的提案源自boost::thread,最初的行为是boost::thread现在所做的。

但是,在标准化过程中,如果尚未加入,则很多人希望析构函数中的std::thread::~thread()join(),而不是detach()。每一方都提出了争论,并进行了投票。 50/50。提出了更多的论点,并进行了更多的投票。有些人摇摆到另一个位置。但仍然是50/50。

有人(我不记得是谁)建议terminate()。已经采取了投票,虽然并不是一致赞成(我不能投票赞成它),但它确实得到了足够的多数被称为共识。

我想boost::thread永远不会改变,因为它有一个已安装的用户群,没有人想要不必要地破坏该用户群的代码。

修改

啊,Rob向我们指出了这个重复问题的原文 回答N2802的要点,包括理由。

我还应该注意到std::thread的原始提议有线程取消,〜thread()会取消unjoined-thread然后将其分离,这很有意义。通常只有在父线程由于异常而展开时才会选择此代码路径。