c++ jthread 使用详解

c++ jthread 使用详解

std::jthread c++20

  • 头文件 #include <thread>
  • 对 std::thread 的改进,旨在提供更好的线程管理和异常处理,除了拥有和 std::thread 完全相同的功能以及 API 之外,还增加了以下功能:
    • 可停止:提供了停止线程相关的 API,可以更好的管理线程;
    • 顶层函数:jthread 所要运行的顶层函数可选的接收一个 std::stop_token 对象作为第一个参数;
    • 自动停止:析构函数会调用 request_stop 方法,停止当前线程;
    • 自动加入:析构函数会根据当前线程的 joinable 状态,自动调用 join 方法,不再需要显式调用 join 来等待线程结束,从而避免了忘记加入线程带来的问题;
    • 异常处理:jthread 对象可以处理线程中可能抛出的异常,确保异常不会无限制地传播到主线程之外;

停止相关 API

  • get_stop_source:返回与线程的停止状态关联的 stop_source 对象,一般用于停止线程;
  • get_stop_token:返回与线程的共享停止状态关联的 stop_token,一般用于查询线程停止状态;
  • request_stop:请求线程停止;

基本使用

#include <chrono>
#include <thread>using namespace std::literals;void f(int n)
{for (int i = 0; i < 5; ++i) {printf("thread is running\n");++n;std::this_thread::sleep_for(10ms);}printf("n is %d\n", n);
}int main()
{int n = 0;std::jthread t(f, n + 1);// t 在析构时结合
}

停止使用

#include <thread>
#include <chrono>using namespace std::literals;void f(std::stop_token stoken, int n) {while (!stoken.stop_requested()) {printf("thread is running\n");++n;std::this_thread::sleep_for(10ms);}printf("thread is stop, n is %d\n", n);
}int main() {int n = 0;std::jthread t(f, n);std::this_thread::sleep_for(50ms);auto st = t.get_stop_token();// 查询是否可停止printf("main, thead can stop %d\n", st.stop_possible());// 停止线程第一种方法t.request_stop();// 停止线程第二种方法// auto src = t.get_stop_source();// src.request_stop();// 查询是否已被请求停止printf("main, thead is requested stop %d\n", st.stop_requested());// t 在析构时自动停止并结合return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人地磅称重系统|自助过磅 料仓联动 自助卸料

上海思伟无人地磅系统 自助过磅、 自助卸料 、料仓联动 智能、省人、安全 无人监管过磅 对地磅及其相关的所有硬件进行配置和管理&#xff1b; 支持红外、道闸、车牌识别、AI分析、拍照存档、LED语音播报一体机等设备&#xff1b; 实现稳定可靠的无人监管称重功能&#xf…

云服务器哪家强?阿里云双十一2核2G配置3M带宽仅99元/年!

阿里云作为国内知名的云计算服务提供商&#xff0c;每年的双11都会推出各种优惠活动和促销策略。在今年的双11期间&#xff0c;阿里云推出了多种选择的云服务器&#xff0c;其中两款备受用户关注&#xff1a;轻量服务器2核2G3M带宽优惠价87元一年和经济型e实例2核2G配置3M带宽9…

Vue3 ref函数和reactive函数

一、ref函数 我们在setup函数中导出的属性和方法虽然能够在模板上展示出来&#xff0c;但是并没有给属性添加响应式&#xff0c;因此&#xff0c;我们需要使用ref函数来为我们的数据提供响应式。 &#xff08;一&#xff09;引入ref函数 import { ref } from "vue"…

数据结构:红黑树的原理和实现

文章目录 红黑树的概念红黑树的性质红黑树的模拟实现红黑树的平衡问题 整体实现和测试 本篇用于进行红黑树的拆解和模拟实现&#xff0c;为之后的map和set的封装奠定基础 红黑树的概念 红黑树也是一种二叉搜索树&#xff0c;但是在每一个节点的内部新增了一个用以表示该节点颜…

IDEA的优化配置教程

前言 IDEA 全称 IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以…

Day 项目介绍与 SSM 环境搭建

介绍一个使用Java语言开发的项目&#xff0c;演示并如何搭建一个基于SSM&#xff08;SpringSpring MVCMyBatis&#xff09;框架的开发环境。SSM是一种常用的Java Web开发框架&#xff0c;它集成了Spring、Spring MVC和MyBatis&#xff0c;提供了一套完整的开发架构&#xff0c;…

OOM汇总

1. 堆内存溢出 堆内存溢出通常是由于创建了过多的对象&#xff0c;而导致堆内存耗尽而发生的。以下是导致堆内存溢出的一些常见情况&#xff1a; 内存泄漏&#xff1a; 如果程序中存在内存泄漏&#xff0c;即一些对象不再被引用&#xff0c;但仍然存活于堆内存中&#xff0c;…

thinkphp5 连接多个服务器数据库

如果你的database.php 是这样&#xff0c; 这是默认的db连接配置 如果还想连接其他服务器&#xff0c;或数据库 在config.php中追加数据库配置&#xff0c; 在使用的地方调用&#xff1a; use think\Db;public function test(){$db3Db::connect(config(db3));$result $db3…

使用gitflow时如何合并hotfix

前言 在使用 git flow 流程时, 对于项目型的部署项目经常会遇到一个问题, 就是现场项目在使用历史版本时发现的一些问题需要修复, 但升级可能会有很大的风险或客户不愿意升级, 这时就要求基于历史版本进行 hotfix 修复. 基于历史发布版本的缺陷修复方式不同于最新发布版本的补…

CSS 实现文字两端对齐效果

直接上代码&#xff1a; .text{text-align: justify;text-align-last: justify;// 兼容ie (未测试)text-justify: distribute-all-lines; }注意&#xff1a; text-align-last: justify; 只对中文文字起效果。数字和英文字母则需要使用空格间隔开&#xff0c;然后使用上述方法即…

自然语言处理实战项目21-两段文本的查重功能,返回最相似的文本字符串,可应用于文本查重与论文查重

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目21-两段文本的查重功能,返回最相似的文本字符串,可应用于论文查重。本文想实现一种文本查重功能,通过输入两段文本,从中找出这两段文本中最相似的句子。这项技术有助于检测抄袭、抄袭的论文和文章,提高知识创新…

Ubuntu22.04 FTP 搭建以及挂载

软件安装 sudo apt-get update 服务端nfs-kernel-server 客户端nfs-common sudo apt-get install -y nfs-kernel-server nfs-common创建NFS共享目录 sudo mkdir -p /nfssudo chown -R nobody:nogroup /nfs sudo chmod -R 777 /nfs配置文件 sudo vim /etc/exports# [共享目录…

08.oracle的表

oracle的表 一、与表相关的几个概念二、表的几种类型包括&#xff1a;三、对表的一些基本操作 一、与表相关的几个概念 高水位线&#xff08;High Water Mark&#xff09;&#xff1a;是指表中已经被使用的空间的最高位置。当表中的数据被删除或更新时&#xff0c;高水位线不会…

Go使用命令行输出二维码

引言 二维码&#xff08;QR code&#xff09;是一种矩阵条码的标准&#xff0c;广泛应用于商业、移动支付和数据存储等领域。在开发过程中&#xff0c;我们可能需要在命令行中显示二维码&#xff0c;这可以帮助我们快速生成和分享二维码信息。本文将介绍如何使用Go语言生成二维…

【SpringBoot】SpringBoot自动配置底层源码解析

概述 EnableAutoConfiguration源码解析SpringBoot常用条件注解源码解析SpringBoot之Mybatis自动配置源码解析SpringBoot之AOP自动配置源码解析SpringBoot Jar包启动过程源码解析 DeferredImportSelector接口 DeferredImportSelector和ImportSelector的区别在于&#xff1a; …

Ubuntu2204 搭建TFTP 服务

安装软件 sudo apt-get install tftp-hpa tftpd-hpa xinetd配置服务 配置tftp sudo vim /etc/xinetd.d/tftp 填入以下参数&#xff0c;/home/tftp 换成自己的共享目录 server tftp {socket_type dgramprotocol udp wait yes user rootserver /usr/sbin/in.tftpdserver_…

windows远程桌面登录ubuntu,黑屏闪退,

首先需要安装xrdp以后才能远程登录&#xff0c;安装命令 sudo apt-get install xrdp 这里需要注意一个问题&#xff0c;如果在ubuntu 本地登录的情况下&#xff0c;windows远程登录会出现黑屏甚至闪退的问题。原因是本地登录和远程登陆是互斥的&#xff0c;本地登录了就不能远…

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks - 翻译学习

知识密集型NLP任务的检索增强生成 - 论文学习 文章目录 Abstract1 Introduction2 Methods2.1 Models2.2 Retriever: DPR2.3 Generator: BART2.4 Training2.5 Decoding 3 Experiments3.1 Open-domain Question Answering3.2 Abstractive Question Answering3.3 Jeopardy Questio…

java内部类初探

引言 内部类是定义在另一个类中的类&#xff0c;它曾经对于简洁地实现回调非常重要&#xff0c;不过今天lambda表达式在这方面可以做的更好。但内部类对于某些结构的构建还是很有用的。 普通内部类 常规的内部类有以下两个特点&#xff1a; 1.内部类可以对除了自己的外部类以…

医疗器械维修工程师必须重视的方面

彩虹医疗器械维修技能培训开班报名中 长期班低至五折&#xff0c; 打破常规培训模式轻松愉快技术学习&#xff01; 两个多月时间&#xff0c;提升自我&#xff01; 点击进入 彩虹实训基地 理论实践结合教学 小班授课 立即咨询 1 工程师须重视 在医疗行业中&#xff0c;…