当前位置: 首页 > 知识库问答 >
问题:

C11能判断std::thread是否处于活动状态吗?

杜成和
2023-03-14

令我惊讶的是,已经完成执行但尚未加入的C11std::thread对象仍然被视为活动执行线程。下面的代码示例说明了这一点(基于Xubuntu 13.03和G4.7.3构建)。有人知道C 11标准是否提供了一种检测std::thread对象是否仍在积极运行代码的方法吗?

#include <thread>
#include <chrono>
#include <iostream>
#include <pthread.h>
#include <functional>
int main() {
    auto lambdaThread = std::thread([](){std::cout<<"Excuting lambda thread"<<std::endl;});
    std::this_thread::sleep_for(std::chrono::milliseconds(250));
    if(lambdaThread.joinable()) {
        std::cout<<"Lambda thread has exited but is still joinable"<<std::endl;
        lambdaThread.join();
    }
    return 0;
}

共有2个答案

柯易安
2023-03-14

对于“主动运行代码”的定义是什么?据我所知,我不确定线程在可接合后处于什么状态,在大多数情况下,我可以想到你实际上想要精细的粒度控制,就像一个由线程中运行的代码设置的标志

对于特定于平台的解决方案,可以使用GetThreadTimes

戈华茂
2023-03-14

不,我认为这是不可能的。我也会考虑你的设计,如果这样的检查真的有必要,也许你正在寻找类似boost的可中断线程

但是,您可以使用std::async——我无论如何都会这样做——然后依赖std::future提供的功能。

也就是说,您可以使用类似于std::chrono::seconds(0)的方法调用std::future::wait_for。这将为您提供零成本检查,并使您能够比较wait\u for返回的std::future\u status

auto f = std::async(foo);
...
auto status = f.wait_for(std::chrono::seconds(0));
if(status == std::future_status::timeout) {
    // still computing
}
else if(status == std::future_status::ready) {
    // finished computing
}
else {
    // There is still std::future_status::defered
}
 类似资料:
  • 问题内容: 对于每个请求,您可以通过几种不同的方式来判断会话是否已经开始,例如: 要么: 但是,如果您启动会话然后将其关闭,它们都将失败。将返回前一个会话的ID,同时将对其进行定义。同样,如果您已经有一个活动会话,则此时调用将生成一个。有没有一种明智的方法来检查会话当前是否处于活动状态,而不必诉诸输出缓冲,关闭运算符()或其他类似hacky的方法? 编辑8/29/2011:向PHP 5.4添加了新

  • 问题内容: 我有一个每秒调用一次的函数,仅当当前页面位于前台时才运行,即用户没有最小化浏览器或切换到另一个选项卡。如果用户不看它,它是没有用的,并且可能占用大量CPU,因此我不想只在后台浪费时间。 有人知道如何用JavaScript讲这个吗? 注意:我使用jQuery,因此,如果您的答案使用了jQuery,那就好了:)。 问题答案: 您将使用窗口的和事件: 要回答“ Double Fire”的评论

  • 问题内容: 因此,我正在使用下载管理器在我的应用程序中下载多个文件。开始某些活动之前,我需要这些文件才能完成下载。如何检查是否有活动的下载,所以我可以告诉用户等待下载完成。然后,当它们完成时,我需要使按钮可见。我已经用谷歌搜索过,甚至自己(盲目地)尝试了一些代码,但没有任何效果。如果有人可以向正确的方向推动我,我将不胜感激。 问题答案: 使用打听下载。调用时,返回值是下载的ID。您还可以按状态查询

  • 我计划为 EJB 编写一个拦截器,它基本上可以执行以下操作: 问题是,如果em.flush()应用于用@TransactionAttribute(NOT _ SUPPORTED)或@TransactionAttribute(SUPPORTS)注释的方法(即只读方法),它会引发异常,而它在使用默认@ transaction attribute(必需)的方法(即更改数据库的方法)时工作良好。 有没有办

  • 问题内容: 从MDN for NodeList: 在某些情况下,NodeList是一个实时集合,这意味着DOM中的更改会反映在集合中。例如,Node.childNodes处于活动状态: 在其他情况下,NodeList是静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。 所以....有点烦!是否有任何关于哪些

  • 本文向大家介绍C#中如何检查线程是否处于活动状态,包括了C#中如何检查线程是否处于活动状态的使用技巧和注意事项,需要的朋友参考一下 要检查线程是否存在,代码如下: 示例 输出结果 这将产生以下输出- 示例 现在让我们来看另一个示例- 输出结果 这将产生以下输出-