std::jthread与std::thread区别

2023-10-28

​std::jthread是C++20新引入的线程类,与 std::thread 类似,或者说,jthread是对thread进一步的封装,功能更强大​。

​std::jthread的​j实际上是​joining的缩写​,​众所周知,std::thread在其生命周期结束时调用join()(让主线程等待该子线程完成,然后主线程再继续执行,对于不会停止的线程,不要使用join(),防止阻塞其他线程),或调用detach()(调用detach()进行线程分离,使其不影响其他线程运行,比如一个线程中无限循环执行的场景下,需要detach())。如果join()和detach()都没有被调用,析构函数​将立即导致程序异常终止。C++20引入的std::jthread得以解决这个问题,std::jthread对象被析构时,会自动调用join(),等待执行流结束。​

​此外,​std::jthread​​支持外部请求中止操作​,调用join()后可能需要等待很长时间,甚至是永远等待。std::jthread除了提供std::stop_token能够主动取消或停止正在执行的线程,还增加了std::stop_callback允许在停止线程操作时调用一组回调函数。​

来看看cpprefercence关于std::jthread::~jthread的解释:

std::jthread::~jthread

Destroys the ​​jthread​​ object.

If ​​*​this​ has an associated thread (​joinable​()​ ​==​ ​true​​), calls request_stop() and then join().

Notes

The request_stop() has no effect if the ​​jthread​​ was previously requested to stop.

A ​​jthread​​ object does not have an associated thread after

  • it was default-constructed
  • it was moved from
  • join() has been called
  • detach() has been called

If join() throws an exception (e.g. because deadlock is detected),​​ std::terminate()​​ may be called.

关于​std::jthread::join​的作用:​阻塞当前线程直至 ​*​this 所标识的线程结束其执行。​

看例程:

#include <iostream>
#include <thread>
#include <chrono>
 
void foo()
{
    // 模拟耗费大量资源的操作
    std::this_thread::sleep_for(std::chrono::seconds(1));
}
 
void bar()
{
    // 模拟耗费大量资源的操作
    std::this_thread::sleep_for(std::chrono::seconds(1));
}
 
int main()
{
    std::cout << "starting first helper...\n";
    std::jthread helper1(foo);
 
    std::cout << "starting second helper...\n";
    std::jthread helper2(bar);
 
    std::cout << "waiting for helpers to finish..." << std::endl;
    helper1.join();
    helper2.join();
 
    std::cout << "done!\n";
}

输出结果如下:

starting first helper...
starting second helper...
waiting for helpers to finish...
done!

std::jthread::joinable​,主要是用来检查 std::jthread 对象是否标识活跃的执行线程,直接看cpprefercence相关例程:

#include <iostream>
#include <thread>
#include <chrono>
 
void foo()
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
}
 
int main()
{
    std::jthread t;
    std::cout << "before starting, joinable: " << std::boolalpha << t.joinable()
              << '\n';
 
    t = std::thread(foo);
    std::cout << "after starting, joinable: " << t.joinable() 
              << '\n';
 
    t.join();
    std::cout << "after joining, joinable: " << t.joinable() 
              << '\n';
}

输出结果如下:

before starting, joinable: false
after starting, joinable: true
after joining, joinable: false

可知如果 jthread 对象标识活跃的执行线程则为 true ,否则为 false 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::jthread与std::thread区别 的相关文章

随机推荐

  • python PyAV库解析H264视频流及保存指定帧

    PyAV是一个视频处理库 可用于读取 写入和处理视频 要使用PyAV读取视频关键帧 首先需要安装PyAV 可以使用以下命令安装PyAV pip install av 安装完成后 您可以使用以下代码打开视频文件并读取关键帧 import av
  • python数据可视化第八章使用matplotlib绘制高级图表

    使用matplotlib绘制高级图表 1 绘制高等图 等高线图是地形图上高程相等的相邻各点所连成的j闭合曲线 它会将地面上海拔高度相同的点连成环线 之后将环线垂直投影到某一水平面上 并按照 定的比例缩绘到图纸上 常见于山谷 山峰或梯度下降算
  • CloudOS:物联网开发平台,云上开发,边端交付

    什么是物联网 物联网 Internet of Things 简称IoT 是指通过各种信息传感器 射频识别技术 全球定位系统 红外感应器 激光扫描器等各种装置与技术 实时采集任何需要监控 连接 互动的物体或过程 采集其声 光 热 电 力学 化
  • iOS开发中,使用PC查看/修改沙盒文件

    简介 在进行iOS开发中 APP尤其是游戏 在沙盒中可以存放游戏资源包或者数据 例如Json文件 AssetBundle包 在使用服务器下载资源包 存放到本地沙盒中 可以大大减少APP本身的大小 当然 在调试的时候 如果频繁的更换服务器的A
  • 处理告警“ warning #69-D integer conversion resulted in truncation”的方法

    今天分享一个常见的语法告警 就是实参与形参的类型参数对于不上 错误之处 首先我们先看一下告警提示 告警 c 49 warning 69 D integer conversion resulted in truncation 其翻译过来意思就
  • 二 动态SQL和多对一,一对多

    二 动态SQL和多对一 一对多 10 多对一处理 测试环境搭建 按照查询嵌套处理 子查询 按照结果嵌套处理 联表查询 11 一对多 按照结果嵌套处理 按照查询嵌套处理 小结 12 动态 SQL IF choose when otherwis
  • xpath下载安装——Python爬虫xpath插件下载安装(2023.8亲测可用!!)

    目录 1 免费下载插件链接 若失效评论区留言发送最新链接 2023 7亲测可用 2 安装插件 1 打开chrome浏览器页面 点击 右上角三个点 gt 扩展程序 gt 管理拓展程序 若没找到点更多工具 2 打开右上角开发者模式 3 将刚刚下
  • 关于maven创建java-web工程加载过慢如何解决问题

    如何解决maven创建java web工程加载过慢如何解决问题 在创建项目时在这个界面中 添加设置一组变量archetypeCatalog internal 然后点击完成继续创建就可以了 但是这样做每次创建项目都要重复添加 很麻烦 如果大家
  • Spring实现封装自定义注解@Trimmed清除字符串前后的空格

    在Spring中实现字符串清除的方法有很多 原生方法String自带trim 方法 或者使用StringUtils提供的trim 方法 通常可以将上面的方式封装成自定义注解的形式去实现来节省更多的业务代码 Trimmed java impo
  • Foggy_driving数据集下载以及将其转换成VOC数据格式

    Foggy driving数据集官方下载地址 百度网盘下载链接 https pan baidu com s 1q4dhnlX doxlt13Mi uFZQ 提取码 2ap3 VOC格式的Foggy driving数据集百度网盘下载链接 ht
  • html基础题目

    1 在html中 样式表按照应用方式可以分为三种类型 其中不包括 d A 内嵌样式表 B 行内样式表 C 外部样式表文件 D 类样式表 2 在HTML中 可以使用 d 标记向网页中插入GIF动画文件 A
  • 从零开始实现自己的Kalimba——Cocos Creator新手教程系列(一)使用瓦片图Tiledmap设计游戏地图

    瓦片图Tiledmap可能是很多2d游戏开发者的偏爱 本节就Cocos Creator如何使用瓦片图进行详细的讲解 Tiled地图编辑器的下载安装不再赘述 下面介绍如何使用地图编辑器 创建新地图 地图方向选正常 其中45度和等角 交错 适合
  • uview2.0封装http请求实战以及常见请求传参实录

    1 前言 2 使用步骤 2 1 配置请求拦截器以及api集中管理配置 2 2 main js中进行引入请求拦截器 2 3 页面中引入请求方法并使用 1 前言 uview2 0是uniapp开发中使用频率相对来讲比较高的一款框架 今天从实战角
  • python爬虫十二:初步使用Scrapy框架爬取数据

    1 通过pipelines操作拿到的数据 要点一 爬虫文件必须通过关键字yield生成器才能与pipelines建立链接才可以操作 当运行爬虫文件之后执行的顺序如下图简介 如果重写模块或者内部方法可能会造成麻烦 往下翻阅可以看到open s
  • UC测试实习生笔试面试

    笔试 2014年5月14号 中大公教C402 一个半钟 好紧的时间 除了选择题和编程题 其他都感觉不好啊 一 选择题 1 chmod 755 filename 之后 文件权限为 A rwxr xr x 2 403状态表示 3 用于转义的字符
  • Python3网络爬虫--爬取百度搜索结果(附源码)

    文章目录 一 准备工作 1 工具 二 思路 1 爬虫思路 2 数据抽取思路 三 源代码 四 结果 五 总结 今天更新一篇基础 使用Python爬取百度搜索结果 最后将爬取结果保存到txt文本文件中 一 准备工作 1 工具 1 Google
  • java线程安全问题分析、3种解决办法

    目录 一 线程不安全 1 1 代码 1 2 解析 解析 卖出不存在的票 解析 卖出相同的票 1 3 解决办法 二 解决方法1 同步代码块 2 1 代码 2 2 解析 三 解决方法2 同步方法 3 1 代码 3 2 说明 四 解决方法3 Lo
  • php如何实现mac端重签ipa,mac用终端对ipa包重新签名

    一年前写过一个用命令行对安卓的apk包重新签名的文章 网上是让用IResin这个软件 但是我用了总是重签名失败 报错warning resource rules has been deprecated in Mac OSX gt 10 10
  • Qml-------ApplicationWindow

    QML内的窗口元素 ApplicationWindow和window 此文章讲解一下ApplicationWindow的基础使用 导入模块 QtQuick Controls qt两个模块的定义与使用方法 import QtQuick Con
  • std::jthread与std::thread区别

    std jthread是C 20新引入的线程类 与 std thread 类似 或者说 jthread是对thread进一步的封装 功能更强大 std jthread的 j实际上是 joining的缩写 众所周知 std thread在其生