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

博主介绍:程序喵大人

概述

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

核心特性

1. 灵活的线程管理

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

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

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

  • 核心线程无限等待新任务
  • 缓存线程使用超时等待,避免资源浪费
cpp 复制代码
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块包裹,确保异常不会逃逸到线程函数外:

cpp 复制代码
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():立即终止所有线程
cpp 复制代码
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);
    }
}

使用示例

基本用法
cpp 复制代码
// 创建线程池配置
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;
}
异常处理示例
cpp 复制代码
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!

相关推荐
未来之窗软件服务26 分钟前
操作系统应用(三十三)php版本选择系统—东方仙盟筑基期
开发语言·php·仙盟创梦ide·东方仙盟·服务器推荐
是Dream呀31 分钟前
昇腾实战|算子模板库Catlass与CANN生态适配
开发语言·人工智能·python·华为
零匠学堂202534 分钟前
移动学习系统,如何提升企业培训效果?
java·开发语言·spring boot·学习·音视频
不会c嘎嘎37 分钟前
【数据结构】AVL树详解:从原理到C++实现
数据结构·c++
小杨快跑~41 分钟前
从装饰者到桥接再到工厂:模式组合的艺术
java·开发语言·设计模式
say_fall43 分钟前
C语言编程实战:每日一题:随机链表的复制
c语言·开发语言·链表
拾贰_C1 小时前
【Python | Anaconda】 python-Anaconda 一些命令使用
开发语言·python
AKDreamer_HeXY1 小时前
ABC434E 题解
c++·算法·图论·atcoder
罗湖老棍子1 小时前
完全背包 vs 多重背包的优化逻辑
c++·算法·动态规划·背包
二川bro1 小时前
循环性能提升:Python向量化计算技巧
开发语言·python