新闻中心

c++怎么使用C++20的std::jthread_C++20中std::jthread的用法与自动线程管理

2025-10-30
浏览次数:
返回列表
std::jthread是C++20中可自动合并的线程类,其析构函数会自动调用join()避免程序终止,并支持通过stop_token和request_stop()实现协作式中断,提升线程管理的安全性与便捷性。

c++怎么使用c++20的std::jthread_c++20中std::jthread的用法与自动线程管理

在C++20中,std::jthread 是对 std::thread 的改进版本,提供了更安全、更便捷的线程管理方式。它最大的特点是支持自动线程合并(join)和协作式中断(cooperative interruption),避免了因忘记调用 join() 而导致程序终止的问题。

什么是 std::jthread?

std::jthread 是 "joining thread" 的缩写,它的析构函数会自动调用 join(),确保线程正确结束,不会像 std::thread 那样在未 join 时触发 std::terminate()。

此外,它内置了停止机制,通过 std::stop_tokenstd::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 Musho

AI网页设计Figma插件

Musho 76 查看详情 Musho

示例:响应中断请求

#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递归快速排序中静态变量导致数据累积的陷阱与解决方案 

搜索