讲师中心 微信公众号
AI工具推荐 视频效率加速

C++怎么使用jthread_C++20线程教程【自动】

冬浩君_1838

冬浩君_1838

发布时间:2026-03-07 12:05:27

|

432人浏览过

|

来源于php中文网

原创

jthread不能直接替换std::thread,因其内置停止令牌机制需线程函数显式接收并检查std::stop_token,否则request_stop()无效且析构可能卡死。

c++怎么使用jthread_c++20线程教程【自动】

为什么 jthread 不能直接替换 std::thread

因为 jthread 不只是“带自动 join 的 thread”,它还绑定了停止令牌(std::stop_token)和停止源(std::stop_source),默认构造时就自带可协作中断能力。直接把 std::thread 改成 jthread,但函数里完全不查 stop_token,那中断逻辑就形同虚设——看起来能编译,运行时却无法响应 request_stop()。

常见错误现象:jthread 对象析构时卡死,或调用 request_stop() 后线程毫无反应。

  • 必须显式接收 std::stop_token 参数(通常作为第一个参数)
  • 线程函数内部需定期检查 token.stop_requested() 或用 token.wait()
  • 不能在 lambda 捕获列表里隐式传入 token;必须通过函数签名传递

jthread 启动时怎么传参给线程函数

和 std::thread 一样支持可变参数转发,但要注意:如果线程函数需要 std::stop_token,它必须是第一个参数,且不能被移动走(比如被 std::move 进 lambda 捕获)。

使用场景:启动一个可安全取消的后台任务,比如轮询、超时等待、资源清理。

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 正确写法:jthread t{[](std::stop_token stoken) { while (!stoken.stop_requested()) { /* work */ } }};
  • 错误写法:jthread t{[stoken = std::stop_token{}]() { ... }}; —— 捕获的 token 是空的,不是线程绑定的那个
  • 传额外参数:用逗号分隔,stop_token 仍占首位,例如 jthread t{[](std::stop_token s, int x, const std::string& y) { ... }, 42, "hello"};

什么时候该用 jthread::request_stop() 而不是 join()

request_stop() 是协作式中断信号,不强制终止线程;join() 是阻塞等待结束。两者目的不同,不能互相替代。

性能影响:request_stop() 几乎零开销,但只有线程函数主动配合才能生效;盲目 join() 可能导致死锁(比如线程在等某个条件,而条件永远不满足)。

  • 必须调用 request_stop() 再 join(),否则析构时会隐式调用 join(),可能卡住
  • 如果线程函数里没检查 token,request_stop() 就只是设了个标志位,线程继续跑
  • 对纯计算型无休眠循环,务必插入 stoken.stop_requested() 检查点,否则无法及时退出

Windows / GCC / Clang 对 std::jthread 的支持现状

C++20 标准已定义 std::jthread,但实际可用性取决于标准库实现,不是编译器版本决定的。

兼容性影响:MSVC 19.30+(VS 2022 17.0)、libstdc++ 12+(GCC 12)、libc++ 15+(Clang 15)才提供完整实现。旧版本即使开了 -std=c++20 也会报错 ‘jthread’ is not a member of ‘std’。

  • 检查方法:#include <thread> 后加 static_assert(__cpp_lib_jthread >= 201911L);
  • GCC 11 及更早:没有 jthread,只能手写带 stop_source 的封装
  • 别依赖 IDE 的语法高亮——它可能误判支持,实际编译失败

协作中断不是银弹,真正难的是设计线程函数的退出路径:sleep 怎么中断、IO 怎么取消、锁怎么释放。这些细节不处理好,jthread 就只是个更贵的 std::thread。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
string转int
string转int

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

6179

2023.08.02

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

登录token无效
登录token无效

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

13486

2023.09.14

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

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

1605

2023.09.14

token怎么获取
token怎么获取

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

3677

2023.12.21

token什么意思
token什么意思

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

5841

2024.03.01

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2158

2023.09.20

string转int
string转int

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

6179

2023.08.02

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

0

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn