根据草案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中改变吗?
答案 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然后将其分离,这很有意义。通常只有在父线程由于异常而展开时才会选择此代码路径。