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

根据草案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版本中会改变吗?

最佳答案
原因主要是历史性的. boost :: thread排在第一位. std :: thread的提议是从boost :: thread派生出来的,最初有boost :: thread现在做的行为.

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

有人(我不记得是谁)建议终止().虽然没有一致赞成(我不能投票赞成),但它确实得到了足够的多数,被称为共识.

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

编辑:

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

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

转载注明原文:c++ 为什么boost :: thread的析构函数分离可连接线程而不是像标准所示调用terminate()? - 代码日志