如何可靠地判断boost线程是否已退出其run方法?

Jef*_*ffV 33 c++ multithreading boost

我认为可加入会表明这一点,但是,似乎并非如此.

在一个工人类中,我试图表明它仍在通过谓词进行处理:

bool isRunning(){return thread_->joinable();}
Run Code Online (Sandbox Code Playgroud)

退出的线程不能加入吗?我错过了什么... boost thread :: joinable是什么意思?

int*_*jay 31

由于即使在终止之后你也可以加入一个线程,所以joinable()仍会返回true,直到你调用join()或detach().如果你想知道一个线程是否仍在运行,你应该能够在等待时间为0的情况下调用timed_join.注意这可能导致竞争条件,因为线程可能在调用之后立即终止.

  • 我觉得这真的很糟糕.为什么助推器设计师从不考虑直觉或初学者.一个简单的isRunning()方法已经足够了.相反,他们强迫一个人使用在这种情况下不应直观使用的功能.我不想尝试加入线程,我只是想快速测试它是否仍然有效.这是垃圾.在我发现这个之前浪费了很多时间.在"docs"中也不是一个该死的词. (37认同)
  • 说它可能导致竞争条件有点误导.单靠`timed_join`不能那样做.如果根据调用结果做出任何不正确的假设,当然可以最终得到竞争条件,但这与`timed_join`相比,与假设该调用的结果仍然有效的情况相比较少.无论如何,+1 (6认同)
  • 这个答案对于Windows上的boost 1.55无效:不推荐使用timed_joined(),并且调用try_join_for(0)会返回false,而不检查线程是否已完成.已经针对以下版本的boost发布了补丁,但目前还不清楚boost的开发人员角度的预期行为:https://svn.boost.org/trac/boost/ticket/9618 (4认同)
  • @AndreasT:Well Boost就像你一样由人来完成.如果您有具体的提案,请执行此操作.如果您另外提供包含文档和测试的补丁,那将会更好. (3认同)

Joa*_*son 6

使用具有最小超时的thread :: timed_join().如果线程仍在运行,它将返回false.

示例代码:

thread_->timed_join(boost::posix_time::seconds(0));
Run Code Online (Sandbox Code Playgroud)