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

Abr*_*ile 13 c++ boost-thread c++11

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

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

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

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

ice*_*ime 16

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

如果joinable()那时terminate(),否则没有效果.[ 注意: 隐式分离或连接joinable()其析构函数中的线程可能导致难以调试正确性(用于分离)或性能(用于连接)仅在引发异常时遇到错误.因此,程序员必须确保在线程仍可连接时永远不会执行析构函数.- 尾注 ]

显然,委员会选择了两个较小的罪恶.


编辑我刚刚发现这篇有趣的论文解释了为什么最初的措辞:

如果joinable()那时detach(),否则没有效果.

改为以前引用的一个.