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

C++ C+中的线程析构函数+;0x vs boost,c++,c++11,boost-thread,C++,C++11,Boost Thread,这些天我在看pdf。它解释了用户必须在C++0x中类为std::thread的对象上显式调用detach(),然后该对象才能超出范围。如果不调用它,将调用std::terminate(),应用程序将死亡 我通常使用 /c++ >线程中的C++。如果我错了,请纠正我,但是boost::thread对象在超出范围时会自动分离 在我看来,boost方法遵循RAII原则,而std则没有 你知道这是不是有什么特别的原因吗?这确实是真的,N3225中关于std::thread析构函数的注释解释了这个选择:

这些天我在看pdf。它解释了用户必须在C++0x中类为
std::thread
的对象上显式调用
detach()
,然后该对象才能超出范围。如果不调用它,将调用
std::terminate()
,应用程序将死亡

<>我通常使用 /c++ >线程中的C++。如果我错了,请纠正我,但是
boost::thread
对象在超出范围时会自动分离

在我看来,boost方法遵循RAII原则,而std则没有


你知道这是不是有什么特别的原因吗?

这确实是真的,N3225中关于
std::thread
析构函数的注释解释了这个选择:

如果
可接合()
终止()
,否则不起作用。[注: 隐式分离或连接 一个
joinable()
线程在其 析构函数可能会导致困难 调试正确性(用于分离)或 性能(用于连接)错误 仅当发生异常时遇到 因此程序员必须 确保析构函数永远不会被调用 在线程仍处于活动状态时执行 可接合的-结束注释]

显然,委员会倾向于两害相权取其轻


编辑我刚刚找到了解释最初措辞的原因:

如果
joinable()
detach()
,否则无效


已更改为前面引用的线程。

这里有一种实现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());
#包括
#包括
void run(){/*线程在此处运行*/}
结构螺纹护板
{
运算符()(标准::线程*线程)常量
{
如果(线程->可连接())
thread->join();//这是安全的,但当作用域为的线程超出作用域时,它会阻塞
//thread->detach();//这是不安全的,请检查两次您知道自己在做什么
删除线程;
}
}
自动范围的线程=std::unique_ptr(新std::thread(&run),ThreadGuard());

如果你想用它来分离一个线程,.

为什么不在构造函数中设置一个join\u on\u destruction或detach\u on\u destruction标志,或者以其他方式明确指定它的行为。这里有一篇有趣的文章。谢谢你的报纸。因此,基本上,终止应用程序是最明显的方法,可以提高线程错误的标志。我会说,这是一种有趣且真正的“防御”方式。:)