0

0

如何在C++中优雅地关闭多线程任务?(原子操作)

穿越時空

穿越時空

发布时间:2026-03-15 20:39:33

|

686人浏览过

|

来源于php中文网

原创

应使用 std::atomic 而非普通 bool 作线程退出标志,因其保证可见性与原子性;需用 store/load(relaxed 序),避免值捕获、确保生命周期,并配合超时等待与 RAII 安全 join。

如何在c++中优雅地关闭多线程任务?(原子操作)

std::atomic<bool></bool> 做线程退出标志,别用普通 bool

普通 bool 在多线程间读写不保证可见性和原子性,编译器可能优化掉轮询、CPU 可能缓存旧值,导致线程永远不退出。std::atomic<bool></bool> 强制内存顺序和原子读写,是最轻量也最可靠的协作式退出机制。

  • 必须用 .store(true, std::memory_order_relaxed) 修改,用 .load(std::memory_order_relaxed) 读取(除非你真需要同步其他内存操作)
  • 不要对 std::atomic<bool></bool> 取地址传给线程函数——它不可拷贝,传引用或指针时确保生命周期长于线程
  • 常见错误:在 lambda 捕获中按值捕获 std::atomic<bool></bool>,结果每个线程拿到的是副本,改了也没用

线程函数里别死等,要带超时或条件检查

光靠轮询 running.load() 不够优雅,尤其任务本身有阻塞调用(比如 std::this_thread::sleep_forqueue.pop()、网络 recv())时,可能卡住几十秒才响应退出。

  • 把大块阻塞操作拆成带超时的版本:用 std::condition_variable::wait_for 替代 wait,用 std::queue 配合互斥锁 + 条件变量,而不是无锁轮询
  • 如果用 std::this_thread::sleep_for 做周期性检查,睡眠时间别设太长(比如 100ms 而非 5s),否则退出延迟明显
  • 某些系统调用(如 Linux 的 epoll_wait)支持被信号中断,但 C++ 标准库线程不处理信号——别指望 SIGTERM 能直接打断 std::thread

std::thread::join() 前必须确保线程已收到退出信号并自然结束

直接调 join() 而不先通知退出,线程还在跑,join() 就会永久阻塞,程序卡死。这不是异常,是逻辑错误。

B12
B12

B12是一个由AI驱动的一体化网站建设平台

下载
  • 典型流程:设置 running.store(false) → 等待线程内部检测到并退出 → 再调 join()
  • 别在析构函数里无条件 join(),万一线程还没启动或已 detach,会抛 std::system_error(错误信息:resource_deadlock_would_occurno_such_process
  • 更安全的做法:用 RAII 封装,例如自定义 scoped_thread 类,在构造时接管 std::thread,析构前自动 signal + join,但前提是 signal 逻辑已内聚在线程函数里

别混淆 std::atomic_flagstd::atomic<bool></bool>

std::atomic_flag 是 lock-free 的纯标志位,只支持 test_and_set()clear(),没有 load()/store(),也不支持直接赋值。它比 std::atomic<bool></bool> 更底层,但用起来反而更麻烦。

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

  • 除非你在写无锁数据结构且极度抠性能,否则别碰 std::atomic_flag;日常退出控制,std::atomic<bool></bool> 语义清晰、可读性强、编译器优化友好
  • 错误用法示例:flag.test_and_set() 返回 true 表示“已被设为 true”,不是“当前是 true”——容易逻辑翻转
  • std::atomic<bool></bool> 初始化默认是 false,而 std::atomic_flag 默认是 true(未清空状态),这个差异常被忽略
实际关线程不是按个开关那么简单,关键在“谁发信号、谁收信号、信号怎么不丢、收完怎么安全收尾”。原子变量只是起点,后面那层等待逻辑和资源清理,才是容易卡住的地方。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
lambda表达式
lambda表达式

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

215

2023.09.15

python lambda函数
python lambda函数

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

193

2025.11.08

Python lambda详解
Python lambda详解

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

61

2026.01.05

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

550

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

30

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

45

2026.01.06

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

786

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

377

2025.12.24

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

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

精品课程

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

共94课时 | 11.4万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.1万人学习

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

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