C++ C+中的线程析构函数+;0x vs boost
这些天我在看pdf。它解释了用户必须在C++0x中类为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析构函数的注释解释了这个选择:
std::thread
的对象上显式调用detach()
,然后该对象才能超出范围。如果不调用它,将调用std::terminate()
,应用程序将死亡
<>我通常使用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标志,或者以其他方式明确指定它的行为。这里有一篇有趣的文章。谢谢你的报纸。因此,基本上,终止应用程序是最明显的方法,可以提高线程错误的标志。我会说,这是一种有趣且真正的“防御”方式。:)