根据c++ 0x标准草案,此代码:
void simplethread()
{
boost::thread t(someLongRunningFunction);
// Commented out detach - terminate() expected.
// t.detach();
}
…应该导致terminate()调用,但在boost线程的当前(boost 1.46.1)实现中不会这样做,线程只是在析构函数中分离并继续运行。
我的问题是:为什么?
我认为boost::线程与标准草案一样内联。
这是设计上的原因吗?它会在boost::thread的未来版本中改变吗?
主要是历史原因。boost::thread
排在第一位。std::thread
的建议来源于boost::thread
,最初具有boost::thread
现在所具有的行为。
然而,在标准化过程中,相当多的人希望std::thread::~thread()
到join()
在析构函数中,如果还没有加入,而不是detach()
。双方都进行了辩论,并进行了投票。50/50。争论越来越多,投票也越来越多。有些人倒向了另一种立场。但仍然是一半一半。
有人(我不记得是谁)建议terminate()
。投票进行了,虽然不是一致赞成(我不能投票赞成),但它确实获得了足够的多数,可以称为共识。
我想boost::thread
从来没有改变过,因为它有一个固定的用户群,没有人想为这个用户群不必要地破坏代码。
啊,罗布给我们指出了这个重复问题的原始答案答案指向N2802,其中包括基本原理。
我还应该注意到,std::thread
的原始提议有线程取消,而~thread()将取消未连接的线程,然后分离它,这很有意义。此代码路径通常仅在父线程因异常而展开时才会被选择。