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

mhl*_*666 9 c++ multithreading standards-compliance boost-thread c++11

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

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

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

我的问题是:为什么?

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

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

How*_*ant 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然后分离它,这很有意义.通常只有在父线程由于异常而展开时才会选择此代码路径.