当前位置: 首页 > news >正文

分享个C++线程池的实现源码

博主介绍:程序喵大人

  • 35 - 资深C/C++/Rust/Android/iOS客户端开发
  • 10年大厂工作经验
  • 嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手
  • 《C++20高级编程》《C++23高级编程》等多本书籍著译者
  • 更多原创精品文章,首发gzh,见文末
  • 👇👇记得订阅专栏,以防走丢👇👇
    😉C++基础系列专栏
    😃C语言基础系列专栏
    🤣C++大佬养成攻略专栏
    🤓C++训练营
    👉🏻个人网站

概述

这里介绍一个功能完整C++线程池实现,本线程池设计精巧,支持核心线程与缓存线程管理、任务队列限制、异常处理、优雅关闭等高级特性,详见下文。

核心特性

1. 灵活的线程管理

线程池实现了两种线程类型:

  • 核心线程:始终保持活跃,不会被回收
  • 缓存线程:在任务高峰时创建,空闲超时后自动回收
enum class ThreadFlag { kInit = 0,   // 初始状态kCore = 1,   // 核心线程kCache = 2   // 缓存线程
};
2. 智能的任务调度

线程池使用条件变量(std::condition_variable)实现高效的任务通知机制:

  • 核心线程无限等待新任务
  • 缓存线程使用超时等待,避免资源浪费
if (thread_ptr->flag.load() == ThreadFlag::kCore) {// 核心线程无限等待this->task_cv_.wait(lock, [this, thread_ptr] { ... });
} else {// 缓存线程带超时等待this->task_cv_.wait_for(lock, this->config_.time_out, [this, thread_ptr] { ... });
}
3. 全面的异常处理

每个任务都被try-catch块包裹,确保异常不会逃逸到线程函数外:

this->tasks_.emplace([task]() { try {(*task)(); } catch (const std::exception& e) {std::cerr << "Task execution failed: " << e.what() << std::endl;} catch (...) {std::cerr << "Task execution failed with unknown exception" << std::endl;}
});
4. 优雅的关闭机制

提供两种关闭方式:

  • ShutDown():等待所有任务完成
  • ShutDownNow():立即终止所有线程
void ShutDown(bool is_now) {if (is_available_.load()) {if (is_now) {this->is_shutdown_now_.store(true);} else {this->is_shutdown_.store(true);}this->task_cv_.notify_all();is_available_.store(false);}
}

使用示例

基本用法
// 创建线程池配置
meow::ThreadPool::ThreadPoolConfig config(2, 4, 50);
meow::ThreadPool pool(config);// 启动线程池
pool.Start();// 提交任务
autofuture = pool.Run([]() {return fibonacci(10);
});// 获取结果
if (future) {std::cout << "Result: " << future->get() << std::endl;
}
异常处理示例
auto future = pool.Run([]() {return potentially_throwing_task(true);
});try {if (future) future->get();
} catch (const std::exception& e) {std::cerr << "Caught exception: " << e.what() << std::endl;
}

性能考虑

  1. 锁粒度优化:任务执行在锁外进行,减少锁持有时间
  2. 原子操作:使用std::atomic实现无锁计数器
  3. 动态扩展:根据负载自动调整线程数量
  4. 资源限制:防止任务队列无限增长导致内存问题

总结

代码详见:GitHub - C++线程池实现。

码字不易,欢迎大家点赞,关注,评论,谢谢!

👉C++训练营

一个专为校招、社招3年工作经验的同学打造的 1v1 项目实战训练营,量身定制学习计划、每日代码review,简历优化,面试辅导,已帮助多名学员获得大厂offer!


文章转载自:

http://APoPfjq9.dpzcc.cn
http://k77otZUU.dpzcc.cn
http://Tf0o1h2F.dpzcc.cn
http://bHOq3RGk.dpzcc.cn
http://yW0F0ebC.dpzcc.cn
http://uwccfiFB.dpzcc.cn
http://Dmj4KFW7.dpzcc.cn
http://Pr0xT6vQ.dpzcc.cn
http://WNL4WKlo.dpzcc.cn
http://LuSWarfH.dpzcc.cn
http://MxoCoKlF.dpzcc.cn
http://CHZAmnXo.dpzcc.cn
http://SBGJau3B.dpzcc.cn
http://AbTSVMJj.dpzcc.cn
http://6shHUJwS.dpzcc.cn
http://GmCF67TF.dpzcc.cn
http://oYRlJzF0.dpzcc.cn
http://oUdefc48.dpzcc.cn
http://fSu90t1R.dpzcc.cn
http://VavF0YEM.dpzcc.cn
http://ILbB9Ma5.dpzcc.cn
http://pGbAjxDG.dpzcc.cn
http://xHwr5uIJ.dpzcc.cn
http://NLCe1YtU.dpzcc.cn
http://frf3MYG5.dpzcc.cn
http://WBUUGMXY.dpzcc.cn
http://bSItPRRy.dpzcc.cn
http://rUFpiEOT.dpzcc.cn
http://02S2R4OE.dpzcc.cn
http://S13mkwjW.dpzcc.cn
http://www.dtcms.com/a/367887.html

相关文章:

  • 143. 重排链表
  • 实习结束,秋招开启
  • MySQL集群高可用架构---mysql高可用之组复制 (MGR)
  • nginx采用反向代理的时候使用变量的坑
  • Kali搭建sqli-labs靶场
  • 【硬件笔记】负载是如何烧MOS的?
  • 从 Prompt 到 Context:LLM OS 时代的核心工程范式演进
  • 设计模式从入门到精通之(六)策略模式
  • 【译】GitHub Copilot for Azure(预览版)已经在 Visual Studio 2022 中推出
  • langchain 提示模版 PromptTemplate
  • Ubuntu开发笔记:1.常见操作指令
  • DDD+WebAPI实战
  • 狗都能看懂的HunYuan3D 1.0详解
  • CodeQL(Mac)安装与测试(Visual Studio)简明指南
  • Next.js 介绍:为什么选择它来构建你的下一个 Web 应用?
  • $attrs学习
  • 无定位更安全:5G 高清视频终端的保密场景适配之道
  • GitHub 热榜项目 - 日榜(2025-09-05)
  • 一文看懂什么是GaN HEMT以及其工艺流程(氮化镓高电子迁移率晶体管)
  • 【AI编程工具】快速搭建图书管理系统
  • 安卓学习 之 EditText 控件
  • 2025职教技能大赛汽车制造与维修赛道速递-产教融合实战亮剑​
  • java面试中经常会问到的zookeeper问题有哪些(基础版)
  • 光伏项目无人机踏勘--如何使用无人机自动航线规划APP
  • jenkins加docker 部署项目
  • linux离线安装elasticsearch8.19.3
  • Jenkins环境搭建与使⽤
  • Jenkins 监控方案:Prometheus + Grafana 实践
  • 【论文阅读】Security of Language Models for Code: A Systematic Literature Review
  • 神经网络算法各种层的原理(基于Keras)--输入层,全连接层,卷积层,池化层,嵌入层,长短期记忆网络层等