对于分离线程,我们不能使用joinable()
,并且使用bool变量似乎不是正确的方法。有没有办法检查分离的线程是否仍在运行并且仍在运行?
答案 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;
}