0

0

C++如何使用std::jthread自动join线程?

尼克

尼克

发布时间:2026-02-20 11:11:09

|

215人浏览过

|

来源于php中文网

原创

std::jthread构造即启动、析构自动join()(除非已detach),内置stop_token协作中断机制,参数传递需注意生命周期,不提供joinable()而用get_id()判空。

c++如何使用std::jthread自动join线程?

std::jthread 构造后线程就运行,不用手动 join()detach()

std::jthread 的核心设计目标就是“离开作用域时自动 join()”,前提是没被提前 detach() 过。它不是“帮你调一次 join()”的语法糖,而是 RAII 安全封装:构造即启动,析构即阻塞等待完成(除非已分离)。

常见错误是仍像用 std::thread 那样在作用域末尾手动写 t.join() —— 这不仅多余,还可能因重复 join() 导致 std::system_error(错误信息:resource_deadlock_would_occur)。

  • 构造 std::jthread 时传入可调用对象,线程立即启动,无需 std::thread::joinable() 检查
  • 若线程函数执行很快,std::jthread 对象析构时几乎立刻返回;若执行久,析构会阻塞直到完成
  • 显式调用 t.detach() 后,析构不再 join(),但之后不能再调用 join()detach()

如何安全传递参数给 std::jthread 构造函数

std::thread 一样,参数默认按值拷贝;引用需用 std::ref()std::cref() 显式包装,否则容易悬垂。

典型陷阱:捕获局部变量地址传进线程,而该变量在 std::jthread 析构前就已销毁 —— std::jthread 的自动 join() 不解决生命周期问题,只解决“是否等待”问题。

立即学习C++免费学习笔记(深入)”;

Flux AI
Flux AI

Flux AI,释放你的想象力,用文字生成图像

下载
  • 传值安全,但注意大对象拷贝开销;移动语义可用 std::move()(如传 std::stringstd::vector
  • 传引用必须用 std::ref(x),且确保 x 的生命周期长于线程执行时间
  • lambda 捕获同理:避免 [&] 捕获栈变量,改用 [=] 或显式 [x = std::ref(x)]
int data = 42;
std::jthread t{[data](int x) { /* data 是副本 */ }, 100}; // 安全
std::jthread t2{[](int& x) { x++; }, std::ref(data)}; // 必须 std::ref

std::jthread 的 stop_token 和 stop_source 怎么配合使用

这是 std::jthread 真正区别于 std::thread 的关键:内置协作式中断支持。线程函数第一个参数若为 std::stop_token,就能收到外部请求停止信号。

别误以为 stop_token 能强制终止线程 —— 它只是通知机制,线程必须主动检查(如调用 token.stop_requested() 或阻塞在 token.wait() 上)。不检查就完全无效。

  • 构造 std::jthread 时,若线程函数接受 std::stop_token,会自动绑定当前线程的 stop_source
  • 调用 t.request_stop() 发送中断请求,仅影响该线程自己的 stop_token
  • 常见模式:循环中定期检查 token.stop_requested(),或用 std::condition_variable::wait(token, ...) 自动响应
std::jthread t{[](std::stop_token token) {
    while (!token.stop_requested()) {
        do_work();
        std::this_thread::sleep_for(10ms);
    }
}};
// ... later
t.request_stop(); // 安全触发退出循环

哪些场景下 std::jthread 反而更麻烦

自动 join() 是优点,也是约束。当需要“启动后彻底放手”或“跨作用域管理线程生命周期”时,std::jthread 就不如 std::thread 灵活。

比如线程对象需作为类成员长期持有,又不想每次析构都阻塞(例如类析构发生在关键路径上),这时强制 join() 可能拖慢 shutdown 流程;或者你明确想让线程后台运行至程序结束,那 detach()std::jthread 就退化成带 stop 支持的 std::thread,优势减弱。

  • 不能把 std::jthread 移动到另一个作用域再析构 —— 移动后原对象变空,新对象析构仍会 join()
  • 若线程函数抛异常,std::jthread 析构时仍会 join(),但异常未被捕获会导致 std::terminate()
  • 没有 joinable() 成员函数(C++20 标准规定),判断是否可 join 得靠是否为空(t.get_id() != std::thread::id{}

自动 join 是确定行为,但 stop_token 响应、参数生命周期、异常传播这些点,稍不注意就掉坑里。尤其 stop_token 不是“开关”,是“信号灯”——灯亮了,还得你自己踩刹车。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

790

2023.08.02

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6403

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

836

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1086

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1644

2024.03.01

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

192

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

60

2026.01.05

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.8万人学习

C 教程
C 教程

共75课时 | 4.8万人学习

C++教程
C++教程

共115课时 | 18.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号