如何检查分离的std :: thread是否仍在运行?

时间:2018-11-21 07:58:37

标签: c++ multithreading c++11

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

2 个答案:

答案 0 :(得分:2)

有几种方法可以解决此问题。如果您设置了线程,则可以使用std::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();

但是,这似乎需要大量工作。 std::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
}

话虽如此,很少需要检查这种状态。如果确实如此,那么您应该考虑是否有更简单的选择。

答案 1 :(得分:-1)

当分离的线程完成时,您可以使用std::condition_variable来通知您的主线程:

#include <iostream>
#include <mutex>
#include <thread>

int main()
{
    std::mutex mutex;
    std::condition_variable cv;

    std::thread t([&]() {
        std::cout << "Wait" << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));

        std::unique_lock<std::mutex> lock(mutex);
        std::cout << "Thread end" << std::endl;

        cv.notify_all();
    });

    t.detach();

    std::unique_lock<std::mutex> lock(mutex);
    cv.wait(lock);

    std::cout << "Main end" << std::endl;

    return 0;
}