新闻中心
c++怎么使用C++20的std::jthread_C++20中std::jthread的用法与自动线程管理
std::jthread是C++20中可自动合并的线程类,其析构函数会自动调用join()避免程序终止,并支持通过stop_token和request_stop()实现协作式中断,提升线程管理的安全性与便捷性。

在C++20中,std::jthread 是对 std::thread 的改进版本,提供了更安全、更便捷的线程管理方式。它最大的特点是支持自动线程合并(join)和协作式中断(cooperative interruption),避免了因忘记调用 join() 而导致程序终止的问题。
什么是 std::jthread?
std::jthread 是 "joining thread" 的缩写,它的析构函数会自动调用 join(),确保线程正确结束,不会像 std::thread 那样在未 join 时触发 std::terminate()。
此外,它内置了停止机制,通过 std::stop_token 和 std::stop_source 实现线程的协作式中断,让线程可以安全地响应外部停止请求。
基本用法:替代 std::thread
使用 std::jthread 启动一个线程非常简单,语法与 std::thread 几乎一致:
#include <iostream><br>#include <thread><br>#include <chrono><br><br>void task() {<br> for (int i = 0; i < 5; ++i) {<br> std::cout << "Working... " << i << "\n";<br> std::this_thread::sleep_for(std::chrono::milliseconds(500));<br> }<br>}<br><br>int main() {<br> std::jthread t(task); // 自动管理,无需手动 join<br> // 析构时会自动 join<br> return 0;<br>}
上面的例子中,main 函数结束时,t 被销毁,其析构函数会自动等待线程执行完毕,无需手动调用 join()。
协作式中断:安全停止线程
std::jthread 支持通过 stop_token 检查是否收到停止请求,并主动退出。这是 C++20 新增的重要特性。
Musho
AI网页设计Figma插件
76
查看详情
示例:响应中断请求
#include <iostream><br>#include <thread><br>#include <chrono><br><br>void cancellable_task(std::stop_token stoken) {<br> for (int i = 0; i < 10; ++i) {<br> if (stoken.stop_requested()) {<br> std::cout << "任务被取消,正在退出...\n";<br> return;<br> }<br> std::cout << "工作 " << i << "\n";<br> std::this_thread::sleep_for(std::chrono::milliseconds(300));<br> }<br> std::cout << "任务完成。\n";<br>}<br><br>int main() {<br> std::jthread t(cancellable_task);<br> std::this_thread::sleep_for(std::chrono::milliseconds(1200));<br> t.request_stop(); // 请求线程停止<br> return 0;<br>}
在这个例子中:
- cancellable_task 接收一个 std::stop_token 参数
- 循环中定期检查 stop_requested()
- 主线程在 1.2 秒后调用 request_stop() 发出中断信号
- 子线程检测到后优雅退出
获取 stop_token 和自定义逻辑
你也可以在任务内部获取 jthread 的 stop_token:
void task_with_internal_check(std::jthread& t) {<br> auto token = t.get_stop_token();<br> for (int i = 0; i < 100; ++i) {<br>
; if (token.stop_requested()) {<br> std::cout << "收到停止信号\n";<br> return;<br> }<br> std::cout << "第 " << i << " 次运行\n";<br> std::this_thread::sleep_for(std::chrono::milliseconds(100));<br> }<br>}
注意参数是引用,避免拷贝 jthread。
基本上就这些。std::jthread 让多线程编程更安全、更简洁,特别是自动 join 和中断机制,减少了资源泄漏和死锁风险。如果你使用 C++20 或更高版本,推荐优先使用 std::jthread 替代 std::thread。
以上就是c++++怎么使用C++20的std::jthread_C++20中std::jthread的用法与自动线程管理的详细内容,更多请关注其它相关文章!
# 相关文章
# 石柱智能化网站建设
# 西安seo顾问 神超seo
# 镇江推广网络营销哪家好
# 厦门网站建设说明
# 汕头网站关键词优化招商
# 什么是网络推广营销策略
# 通达oa建设网站
# 有哪些适合做推广的网站
# 网站搭建推广优化软件
# qq群网络推广网站
# 中文网
# ai
# 在这个
# 如果你
# 边缘
# 这是
# 尼克
# 死锁
# 多线程
# 游戏开发
# stream
# ios
# c++
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Composer如何解决json扩展缺失的错误
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
在Socket.IO连接中实现Access Token自动更新与动态重连
Animex动漫社网入口地址 Animex动漫社网正版在线入口
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法
天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】
outlook中文官网入口地址 outlook官方中文版直达首页链接
《主播少女的秘密账号迷宫》首支宣传片
实现全屏滚动与导航点:专业教程
如何使用 Excel 发布器与 Power BI 分享 Excel 洞察
Bing引擎入口最新2025 Bing搜索免费官方登录
解决Python logging 中 datefmt 导致时间戳固定不变的问题
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件
护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?
mcjs网页版流畅运行 mcjs低配电脑畅玩入口
Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】
Web Components中自定义开关组件状态同步的常见陷阱与解决方案
b站如何看历史记录_b站观看历史找回方法
知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情
漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接
Python字典中优雅地迭代剩余元素的方法
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景
圆通快递查询实时追踪 圆通物流包裹状态快速查看
sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤
必由学官方登录入口 必由学教师学生账号快速访问
韩剧圈正版入口页面_韩剧圈官网登录链接
UC浏览器官网入口2025最新 UC浏览器网页版正式地址
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
2025-2030年全球乘用车销量预测:新能源成增长主力
微信网页版官方快速登录入口 微信网页版网页版账号直达
微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法
精准捕获:如何在页面中监听除特定元素外的所有点击事件
html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】
poki免费入口快捷访问 poki人气小游戏直接玩站点
电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】
如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit
三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】
12306选座怎么选到临时改签座_12306改签选座策略与步骤
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
DLsite中文平台入口 DLsite官网内容在线查看
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案


2025-10-30
浏览次数:次
返回列表
; if (token.stop_requested()) {<br> std::cout << "收到停止信号\n";<br> return;<br> }<br> std::cout << "第 " << i << " 次运行\n";<br> std::this_thread::sleep_for(std::chrono::milliseconds(100));<br> }<br>}