boost ::线程在删除可加入线程时存在什么问题

BOOST::thread what problems are there in deleting a joinable thread?

本文关键字:线程 存在 问题 在什么 删除 boost      更新时间:2023-10-16

破坏可加入的线程指针会遇到什么问题?(即调用 delete thread)升级引用有点模糊,需要更确切的答案。

这是一个特定示例:

假设一个子螺纹被卡在不可互相的系统调用上,例如read(0),没有人配备键盘。因此,调用thread->interrupt()然后是thread->try_join_for(),将使线程可加入。该怎么办?

在参考指南中,似乎必须拆下线程或泄漏线指针。当卡住线被分离或指针泄漏时,实际上会发生什么。

背景:

boost::thread::~thread()参考中是以下词。作为Boost参考指南的"她出售海滨的贝壳",需要在解析之前阅读三到四次;

在其破坏者中隐式分离或加入Joarable()线程可能会导致很难调试正确性(用于分离)或仅在提出异常时遇到的错误(用于加入)错误。因此,程序员必须确保在线程仍然可加入时永远不会执行驱动器。

(从我可以看出的)缺点是(is)a(is)a(bad)构想(to)销毁(a)boost:::( thread)指针(while)加入)。谁提到了例外?孩子线?破坏者?

它取决于。最初,Boost的实现将在破坏时脱离一个无关的线程。自1.52版以来,这已被更改,以匹配C 11的std::thread的行为:销毁一个非连接线程现在调用std::terminate(默认情况下将崩溃程序)。旧行为将作为不弃用的功能保持可用,直到1.56,并且可以通过设置BOOST_THREAD_DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE预处理器标志来激活。

为您的示例,该线程陷入了a阻塞呼叫中的线程,因此建议必须是:不要这样做。仅使用允许指定超时或使用异步I/O的封锁I/O调用。您需要能够发出一条线程的信号,等待I/O应该终止的I/O,否则您在关闭程序时可能会陷入僵局。

从理论上讲,您无法连接线程(即分离或泄漏boost::thread对象)。但是,这通常会引起许多其他头痛,因为您不能保证该线程持有的资源将得到适当清理。这使得很难理解这种线程的行为。请注意,ISO-C 确实决定在此处调用terminate是有原因的。