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

C++如何使用std::stop_token和jthread优雅关闭多线程

小辰大大_2100

小辰大大_2100

发布时间:2026-06-16 23:03:32

|

254人浏览过

|

来源于php中文网

原创

不能。std::stop_token只是通知令牌,不自动终止线程;必须在代码中主动轮询stop_requested()并在关键点(如循环内、阻塞前)响应,否则线程无法及时退出。

c++如何使用std::stop_token和jthread优雅关闭多线程

std::stop_token 能不能直接用来终止线程?

不能。它只是个“通知令牌”,本身不带任何终止逻辑,也不会自动中断线程执行。你拿到 std::stop_token 后,必须在循环或关键点主动检查它是否被请求停止——否则线程照常跑完,stop_token 就是张废纸。

常见错误是以为调用 jthread.request_stop() 后线程立刻退出,结果发现日志没打完、资源没释放、甚至死锁。根本原因就是没在工作函数里加检查点。

  • 必须手动轮询:if (token.stop_requested()) break; 或 if (token.stop_requested()) return;
  • 不能只在循环开头检查——如果单次任务耗时长(比如网络读取、文件解压),得在阻塞调用前插入检查,否则响应延迟严重
  • std::stop_token 是只读的,不可修改,也不可重置;一个 jthread 对应唯一一个关联的 std::stop_source

jthread 析构时为什么有时不等待线程结束?

因为默认行为是「析构时自动调用 request_stop() 并 join()」,但前提是线程还在运行且未被 detach。一旦你显式调用了 detach(),或者线程自己提前退出了,jthread 析构就什么也不做——这容易让人误以为“没生效”。

更隐蔽的问题:如果线程函数里没响应 stop_token,join() 就会卡住,导致主线程 hang 住。这不是 jthread 的 bug,而是你没配合好协作式取消。

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

C++14
C++14

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

下载
  • 确保线程函数内有至少一处 token.stop_requested() 检查,且位置合理(尤其在 long-running 操作前后)
  • 不要对 jthread 对象赋值或移动后还依赖原对象的生命周期——移动后原对象处于 valid-but-empty 状态,析构不触发 join
  • 调试时可在析构前加日志:std::cout ,确认是否真走到 join

如何在阻塞系统调用中响应 stop_token?

像 std::this_thread::sleep_for()、std::condition_variable::wait() 这类函数本身不接受 stop_token,强行轮询会浪费 CPU 或延迟响应。C++20 起,标准库提供了带 stop_token 的重载版本,但需注意兼容性和使用方式。

例如 std::condition_variable::wait() 有两个常用带 token 的重载:wait(lock, pred, token) 和 wait_until(lock, timeout_time, pred, token)。它们会在收到停止请求时立即返回 false,让你有机会退出。

  • 优先用标准库提供的带 token 版本,而不是自己写 while+sleep
  • std::this_thread::sleep_for() 没有 token 重载,得换成 std::this_thread::sleep_until() 配合手动检查,或封装成可中断的 sleep 辅助函数
  • 第三方阻塞调用(如 socket recv)无法直接集成,需改用非阻塞 + poll() / select() + 定期检查 token

std::stop_source 和 std::stop_token 怎么共享给多个线程?

一个 std::stop_source 可以生成多个 std::stop_token,这些 token 共享同一停止状态。典型场景是:主线程持有一个 std::stop_source,把它对应的 token 分发给多个工作线程,再统一调用 request_stop() 触发全部退出。

注意 std::stop_source 是可复制的,但不是线程安全的——多个线程同时调用 request_stop() 是安全的(只会生效一次),但不要在多线程里反复 copy + move 它来管理生命周期,容易悬空。

  • 推荐把 std::stop_source 放在最外层作用域(如 main 函数或 class 成员),通过 const-ref 或值传递分发 token
  • 避免把 std::stop_token 存进容器后再遍历调用 stop_requested() ——它只是观察者,没有广播能力
  • 如果需要“某个子任务单独取消”,得为它创建独立的 std::stop_source,而非复用主 token

真正麻烦的从来不是 API 写法,而是判断该在哪检查、检查频率是否合理、阻塞点有没有替换成可中断版本。协作式取消不是加一行 if 就完事,它要求你把线程逻辑拆成可中断的单元——这点比语法细节重要得多。

热门AI工具

更多
WorkBuddy

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

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

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

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

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

切问学术

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

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2248

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

1019

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

427

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

406

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

580

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1409

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1217

2024.03.22

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

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

60

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