特性上,std::jthread相比std::thread主要增加了以下两个功能:

1.std::jthread对象被destruct时,会自动调用join,等待其所表示的执行流结束。

2.支持外部请求中止(通过get_stop_source、get_stop_token和request_stop)。

为什么不是选择往std::thread添加新接口,而是引入了一个新的标准库?

因为std::jthread为了实现上述新功能,带来了额外的性能开销(主要是多了一个成员变量)。而根据C++一直以来“不为不使用的功能付费”的设计哲学,他们自然就把这些新功能拆出来新做了一个类。

// C++20新线程 jthread 体验代码
//
// 编译(编译本代码,-pedantic 不是必须的):
// g++ -std=c++20 -Wall -pedantic -pthread -static-libstdc++ C++20_jthread.cpp -o C++20_jthread
//
// 要求GCC10及以上版本,
// 可使用GCC的Docker镜像静态链接stdc++库,以方便在非GCC10环境运行。
//
// docker pull gcc
// docker run --rm -it -v /data:/data gcc
#include <chrono>
//#include <coroutine> // -fcoroutines
#include <iostream>
#include <stdexcept>
#include <thread>// 线程执行体
void thread_proc(std::stop_token st)
{// 以往中,// 需要自己实现 stop 来停止线程,// 现在 jthread 内置了此能力。while (!st.stop_requested())  std::this_thread::sleep_for(std::chrono::seconds(1));  std::cout << "Thread " << std::this_thread::get_id() << " exit" << std::endl;
}extern "C"
int main()
{std::jthread thr(&thread_proc); // 创建线程std::this_thread::sleep_for(std::chrono::seconds(10));thr.request_stop(); // 通知线程退出thr.join();return 0;
}

第二个特征jthread是帮助我们解决std::thread以前导致的困境:joindetach*。现在jthread来承担一些责任。它的析构函数简单地实现为:

这正是我们在上面的示例中所做的,因此我们可以删除那里的最后两行,如下:

即main的最后,我们不用join了,jthread对象被析构时,会自动调用join函数

std::jthread与std::thread的区别相关推荐

  1. C++ std::thread 和 std::jthread 使用详解 (含C++20新特性)

    目录 std::thread std::thread 构造函数 观察器 操作 std::jthread std::jthread 构造函数 观察器 操作 停止记号处理 管理当前线程的函数 yield( ...

  2. C++——std::async和std::thread

    作者:小 琛 欢迎转载,请标明出处 参考文章: 傻月菇凉博主-博客 OceanStar的学习笔记博主-博客 NGC_2070博主-博客 文章目录 std::thread thread的提出 使用方法. ...

  3. std::unique_lock与std::lock_guard区别示例

    std::unique_lock也可以提供自动加锁.解锁功能,比std::lock_guard更加灵活. std::lock_guard std::lock_guard是RAII模板类的简单实现,功能 ...

  4. std::vector中resize()和reserve()区别

    在STL容器中vector用的还是比较多的,但是在使用时,会对resize()和reserve()的使用产生迷惑,现在就对这一情况做个对比: resize():改变的是size()与capacity( ...

  5. std::make_unique和 std::make_shared区别

    区别1:分配除的指针,前者是不能赋值,只能move,后者可以赋值 区别2:前者使用智能指针数组,后者不行(因为后者分配出来的指针具有单一性) #include #include class A { p ...

  6. std::atomic和std::mutex区别

    ​std::atomic介绍​ ​模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>.​在多线程调用下,利用std::atomic可实现数 ...

  7. std::make_shared<T>/std::make_unique<T>与std::shared_ptr<T>/std::unique_ptr<T>的区别与联系

    (1).std::make_shared<T>与std::make_unique<T>相对于std::shared_ptr<T>/std::unique_ptr&l ...

  8. std::future和std::promise和std::packaged_task

    std::future 其实future有两个兄弟,一个是std::future, 一个是它大哥std::shared_future.他们的区别就是std::future只支持移动语义,它所引用的共享 ...

  9. std::atomic、std::async深入研究

    1.从上节课的一个demo说起. #include <iostream> #include <future> #include <vector> #include ...

最新文章

  1. linux设置定时备份任务,Linux下Oracle设置定时任务备份数据库的教程
  2. HTML控制文本框只能输入数字和小数点,并且只能保留小数点后两位 金额转换,阿拉伯数字的金额转换成 面试题
  3. HTML标签和CSS个人总结
  4. 基于 Ubuntu 搭建微信小程序服务
  5. cnn识别cifar10、cifar100(pytorch)
  6. 套接字Select I/O模型
  7. 牛客题霸 [ 最长递增子序列] C++题解/答案
  8. sql 查询优化小计
  9. 配置Debian11服务器允许root用户远程SSH登录
  10. Maven学习(八)-----Maven依赖机制
  11. 实战:从Mysql数据库frm文件中,提取表结构创建SQL语句
  12. feynman1999_AI Feynman 2.0:从数据中学习回归方程
  13. 软件需求说明书/ 概要设计说明书/项目开发计划/详细设计说明书模版(说明要点及要点解释)
  14. 十岁陌陌更名“挚文集团”的战略新时代|财报解读
  15. java打印指定宽度_如何设置图片打印尺寸,长与宽指定大小(CM)?
  16. 更有效的编写QQ空间、CSDN、博客园图文并茂的文章
  17. 【整理+总结】pink老师前端三件套之HTML笔记(二)HTML标签
  18. MacOS 安装 MySQL
  19. Kafka学习整理三(borker(0.9.0及0.10.0)配置)
  20. 【关于NI CAN USB-8473在实际应用中的案例分析】

热门文章

  1. 最大化_基于最大化互信息的学习目标
  2. 商业逻辑12讲之人力资源的逻辑
  3. 人员梯度培养_干部梯队培养方案
  4. 米10设置aac格式_Tipard Total Media Converter for Mac(全媒体格式转换器)
  5. pdf导入ps颜色太浅_PDF 文件编辑转换难?或许你需要一个扫描全能王!
  6. python坐牢-为什么说炒股要保护好本金 ?
  7. 【UOJ#188】Sanrd(min_25筛)
  8. oracle---函数(trunc,nvl,nvl2)
  9. 1.4激活函数-带隐层的神经网络tf实战
  10. HDU-5783 Divide the Sequence(贪心)