这些天我正在阅读pdf Designing MT programs。它解释了在该对象超出范围之前,用户必须在C ++ 0x中的类detach()
的对象上显式调用std::thread
。如果您不调用它,将调用std::terminate()
并且应用程序将会死亡。
我通常使用boost::thread
在C ++中进行线程化。如果我错了,请纠正我,但当boost::thread
对象超出范围时会自动分离。
在我看来,提升方法遵循RAII原则,而标准则没有。
你知道是否有某种特殊原因吗?
答案 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。