0

0

C++怎么实现线程池_C++并发编程教程【工程】

穿越時空

穿越時空

发布时间:2026-03-16 19:09:34

|

833人浏览过

|

来源于php中文网

原创

线程池的核心是线程复用,而非每次任务新建线程;需固定工作线程、共享安全任务队列、条件变量休眠唤醒机制及原子停止标志,std::jthread仅简化析构与中断,不替代池逻辑。

c++怎么实现线程池_c++并发编程教程【工程】

为什么 std::thread 直接 new 一堆线程不是线程池

线程池的核心是复用,不是“一次一建”。直接用 std::thread 启动 N 个任务,等于每次新建+销毁线程,开销大、调度不可控、还容易触发系统线程数上限(Linux 默认一般 1024)。真正的线程池得有固定数量的工作线程、共享的任务队列、以及安全的取-执行循环。

  • 典型错误现象:std::system_error: Resource temporarily unavailable —— 线程创建失败,大概率是 pthread_create 被系统拒绝,不是代码写错了,是线程炸了
  • 关键区别:线程池里每个 std::thread 对象生命周期贯穿整个程序运行期(或池生命周期),只启动一次;任务通过 std::function<void></void> 投递进队列,由空闲线程取走执行
  • 别用 std::async(std::launch::async) 模拟池——它不保证复用,底层可能每次都起新线程,行为不可控

怎么用 std::queue + std::mutex + std::condition_variable 安全地存任务

任务队列必须线程安全,但不能只靠 std::mutex 锁住整个 push/pop——那样会严重串行化投递和执行。要用条件变量让工作线程在队列空时休眠,避免忙等。

  • 常见坑:把 std::condition_variable::wait 放在 while (!queue.empty()) 外面,导致虚假唤醒后直接 pop 崩溃;必须用 while (queue.empty()) cv.wait(lock)
  • 别用 std::stackstd::deque 替代 std::queue ——虽然底层容器可换,但语义上 std::queue 更清晰,且默认用 std::deque 已足够高效
  • 任务类型建议用 std::function<void></void>,别裸传 std::packaged_task 或 lambda 捕获大对象——容易隐式拷贝引发内存问题;如果需要返回值,用 std::packaged_task<void></void> 包一层再转成 std::function<void></void>

工作线程怎么正确退出(避免死锁和资源泄漏)

线程池析构时,必须让所有工作线程安全退出,否则 std::thread 对象被销毁而线程还在跑,会调用 std::terminate。不能靠“等几秒”或“joinable 就 join”,得有明确的停止信号。

  • 必须设一个原子标志位:std::atomic<bool> stop_requested{false}</bool>,所有工作线程循环中检查它,且在检查前先尝试取任务;队列空 + stop_requested == true 才退出
  • 析构函数里先置 stop_requested = true,再 cv.notify_all() 唤醒所有等待线程,最后对每个 std::thread 调用 join() ——顺序反了就会卡死
  • 别在工作线程里调 std::this_thread::sleep_for 来“降频”——这纯属浪费 CPU 时间片;条件变量 + 原子标志才是正解

std::jthread(C++20)能简化多少?哪些地方仍要手写

std::jthread 自动 join(),解决了最痛的析构安全问题,但它不提供任务队列、不管理线程数量、也不带停止令牌的自动传播——你还是得自己维护队列、同步原语和退出逻辑。

‎ Gemini Storybook
‎ Gemini Storybook

Google Gemini推出的AI绘本生成工具

下载

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

  • 能省掉的:不用手动 join(),不用写 ~thread_pool() 里的 join 循环;std::jthread 构造时可传 std::stop_token,比裸用 std::atomic<bool></bool> 更标准
  • 不能省的:任务队列的线程安全操作、std::condition_variable 的 wait/notify 逻辑、任务执行异常捕获(否则一个任务崩溃会让整个线程退出)、以及线程数量控制(std::jthread 不是池,只是“可协作中断的 thread”)
  • 兼容性注意:GCC 10+、Clang 11+、MSVC 19.28+ 才完整支持 std::jthread;老项目慎用,别为了语法糖引入构建链路问题

真正难的从来不是“怎么启线程”,而是任务如何不丢、不重、不错序、不出错、不卡死——这些细节藏在队列锁粒度、唤醒时机、异常边界和停止信号传递路径里,漏掉任何一环,上线后都可能半夜报警。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.12.20

while的用法
while的用法

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

107

2023.09.25

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函数相关教程,阅读下面的文章了解更多详细内容。

62

2026.01.05

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

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

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

786

2023.08.10

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

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

精品课程

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

共94课时 | 11.5万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.2万人学习

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

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