为什么boost::thread的析构函数分离可接合线程,而不是像标准建议的那样调用terminate()



根据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()将取消未连接的线程,然后分离它,这很有意义。此代码路径通常仅在父线程因异常而展开时才会被选择。

最新更新