首页 > 解决方案 > 如何检查分离的 std::thread 是否仍在运行?

问题描述

对于我们不能使用的分离线程joinable(),使用 bool 变量似乎不是正确的方法。有没有办法检查分离的线程是否还活着并且正在运行?

标签: c++multithreadingc++11

解决方案


有几种方法可以解决这个问题。如果您设置在线程上,那么您可以使用 astd::future<void>来检测它何时退出:

std::promise<void> promised_thread_exit;

std::future<void> thread_exited = promised_thread_exit.get_future();

std::thread(
  [] (std::promise<void> promised_thread_exit)
  {
    promised_thread_exit.set_value_at_thread_exit();
    DoBackgroundWork();
  },
  std::move(promised_thread_exit));
thread.detach();

// later...
thread_exited.get();

但是,这似乎需要做很多工作。Astd::thread是一个相当低级的原语。如果目标只是在后台执行一些工作,那么std::async是一个更好的选择:

std::future<void> work_complete = std::async(std::launch::async, DoBackgroundWork());

// later...
work_complete.get();

在任何一种情况下,如果您需要在不阻塞的情况下检查工作的状态,您可以通过等待future超时 0 来实现:

using namespace std::chrono_literals;

//...

if (work_complete.wait_for(0s) == std::future_status::ready)
{
  // work has finished
}

话虽如此,很少需要像这样检查状态。如果看起来是这样,那么您应该考虑是否有更简单的替代方案。


推荐阅读