【问题标题】:BOOST::thread what problems are there in deleting a joinable thread?BOOST::thread 删除可连接线程有什么问题?
【发布时间】:2014-02-25 11:24:49
【问题描述】:

销毁可连接线程指针可能会遇到哪些问题? (即调用delete thread)提升参考有点模糊,更准确的答案是可取的。

这是一个具体的例子:

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

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

背景:

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

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

这个(据我所知)的短处是(那个)它(是)一个(坏)想法(to)销毁(a)boost ::(线程)指针(而)它(是)仍然(可加入)。谁提出了提到的例外?子线程?析构函数?

【问题讨论】:

    标签: c++ multithreading boost


    【解决方案1】:

    这取决于。最初,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 是有原因的。

    【讨论】:

    • 终止可连接线程听起来正是我想要销毁线程指针的事情。因此,为什么参考指南说你不应该这样做?可能是时候重写参考的那部分了。指导。
    • @MarkGerolimatos 澄清一下:terminate 不仅会终止线程,它还会终止整个进程,即。让你的程序崩溃。
    • 啊,所以不是“thread→terminate()”。感谢您(非常重要的)澄清。
    • 顺便说一句,我的“阻塞 I/O”问题只是一个方便的单行示例。我只是想说明这个问题。另一方面,如果必须在子线程中执行异步 I/O,那么子线程就没有多大用处 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多