gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:54:48 33 4
gpt4 key购买 nike

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

最佳答案

有几种方法可以解决这个问题。如果你设置了线程,那么你可以使用 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
}

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

关于c++ - 如何检查分离的 std::thread 是否仍在运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53407514/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com