C ++ 0x vs boost中的线程析构函数

时间:2010-12-22 10:22:53

标签: c++ c++11 boost-thread

这些天我正在阅读pdf Designing MT programs。它解释了在该对象超出范围之前,用户必须在C ++ 0x中的类detach()的对象上显式调用std::thread。如果您不调用它,将调用std::terminate()并且应用程序将会死亡。

我通常使用boost::thread在C ++中进行线程化。如果我错了,请纠正我,但当boost::thread对象超出范围时会自动分离。

在我看来,提升方法遵循RAII原则,而标准则没有。

你知道是否有某种特殊原因吗?

2 个答案:

答案 0 :(得分:16)

确实如此,N3225在关于std::thread析构函数的说明中解释了这个选择:

  

如果joinable()然后terminate() ,则无效。 [注意:   隐式分离或加入   其中有joinable()个帖子   析构函数可能导致困难   调试正确性(用于分离)或   性能(用于加入)错误   仅在异常时遇到   提高。 因此程序员必须   确保析构函数永远不会   线程静止时执行   可连接即可。 -end note ]

显然,委员会选择了两个邪恶中的较小者。


编辑我刚刚找到this interesting paper,这解释了为什么最初的措辞:

  

如果joinable()然后detach() ,则无效。

已更改为之前引用过的。

答案 1 :(得分:3)

这是实现RAII线程的一种方法。

#include <memory>
#include <thread>

void run() { /* thread runs here */ }

struct ThreadGuard
{
    operator()(std::thread* thread) const
    {
        if (thread->joinable())
            thread->join(); // this is safe, but it blocks when scoped_thread goes out of scope
        //thread->detach(); // this is unsafe, check twice you know what you are doing
        delete thread;
    }
}

auto scoped_thread = std::unique_ptr<std::thread, ThreadGuard>(new std::thread(&run), ThreadGuard());

如果要使用它来分离线程,read this first