BOOST :: thread删除可连接线程有什么问题?

时间:2014-02-01 19:33:54

标签: c++ multithreading boost

销毁可连接线程指针会遇到什么问题? (即调用delete thread)增强参考有点模糊,需要更准确的答案。

这是一个具体的例子:

  

假设子线程卡在不可中断的系统调用上,例如read(0),没有人操作键盘。因此,调用thread->interrupt()后跟thread->try_join_for()将使线程可以连接。该怎么办?

从参考指南中,似乎必须分离线程或泄漏线程指针。当一个卡住的线程被分离或指针泄漏时实际发生的事情超出了这个问题的范围。

背景:

boost::thread::~thread()引用中是以下措辞。作为BOOST参考指南的“她在海边卖贝壳”,它需要阅读三到四次才能解析它;

  

在析构函数中隐式分离或连接joinable()线程可能导致难以调试正确性(用于分离)或性能(用于连接)仅在引发异常时遇到错误。 因此,程序员必须确保在线程仍可连接时永远不会执行析构函数。

缺点(从我所知道的)是(那)它是一个(坏)想法(to)破坏(a)boost ::(thread)指针(while)它(仍然)(加入)。是谁提出了提到的例外?孩子的线程?析构函数?

1 个答案:

答案 0 :(得分:3)

这取决于。最初Boost的实现会在销毁时分离出一个未加入的线程。这是changed since version 1.52以匹配C ++ 11的std::thread的行为:销毁一个未加入的线程现在调用std::terminate(默认情况下会使程序崩溃)。旧行为将作为不推荐使用的功能保留,直到1.56和can be activated by setting the BOOST_THREAD_DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE预处理程序标志。

对于卡在阻塞调用中的线程示例,建议必须是:不要这样做。仅使用允许指定超时或使用异步I / O的阻塞I / O调用。您需要能够发出等待I / O的线程的信号,它应该终止它,否则在关闭程序时可能会出现死锁的风险。

理论上你可以不加入线程(即分离或泄漏boost::thread对象)。但是,这通常会导致许多其他问题,因为您无法保证该线程持有的资源能够得到适当的清理。这使得很难推断出这种线程的行为。请注意,ISO-C ++确实决定在这里调用terminate