c++ - 如何检查分离的 std::thread 是否仍在运行?
问题描述
对于我们不能使用的分离线程joinable()
,使用 bool 变量似乎不是正确的方法。有没有办法检查分离的线程是否还活着并且正在运行?
解决方案
有几种方法可以解决这个问题。如果您设置在线程上,那么您可以使用 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
}
话虽如此,很少需要像这样检查状态。如果看起来是这样,那么您应该考虑是否有更简单的替代方案。
推荐阅读
- php - PHP 和 MySQL:只比较月份和日期,而不考虑日期字段中的年份
- javascript - 带有 JEST 的 Nodejs 如何使用 ES6 和相对路径导入?
- django - django 的 bulk_create 是原子的吗?
- java - (Eclipse Persistence Services - 2.5.2.v2):org.eclipse.persistence.exceptions.DatabaseException 异常说明:
- php - 尝试在 goutte 中创建爬虫时总是出错
- ios - 自定义 @IBDesignable UIButton 使 Xcode 崩溃
- android - CameraX 是否支持微距对焦?
- c# - 我可以使用无键实体类型在 Entity Framework Core 中查询 CHANGETABLE 吗?
- r - R:Apriori 算法没有找到任何关联规则
- sql - 将多行插入表sql,oracle