CHAPTER 12
Threadpool 线程池
对应文件:
- 接口:
include/Threadpool.h - 实现:
src/Threadpool.cpp
1. 模块定位
ThreadPool 提供基础线程池能力:
- 固定数量 worker 线程
- 线程安全任务队列
- 条件变量唤醒
- 有界任务队列(默认上限 10000)
2. 核心数据结构
threads_:工作线程列表tasks_:queue<function<void()>>mtx_:队列互斥cv_:任务可用/停止通知running_:线程池运行状态(atomic)maxTasks_:最大队列长度
3. 生命周期
3.1 构造 ThreadPool(numThreads)
running_=true- 创建
numThreads个 worker - worker 循环:
- 等待
cv_ - 条件:池停止或任务非空
- 若池停止且任务空,退出线程
- 否则取任务执行
- 对任务异常进行 catch,避免线程崩溃
- 等待
3.2 析构 ~ThreadPool()
- 加锁设
running_=false notify_all唤醒所有线程- join 所有
joinable线程
4. addTask 实现细节(模板,头文件)
流程:
- 加锁
- 若
running_ == false返回false - 若
tasks_.size() >= maxTasks_返回false - 入队:
- 无参数任务:直接 emplace(避免某些编译器对
bind推导问题) - 有参数任务:
std::bind(...)后 emplace
- 无参数任务:直接 emplace(避免某些编译器对
- 解锁后
notify_one - 返回
true
5. 并发语义
- 生产者:调用
addTask - 消费者:worker 线程
- 条件变量用于“无任务阻塞、有任务唤醒”
- 通过
running_+ 队列空判断实现有序退出
6. 优点
- 结构清晰,代码短小
- 异常隔离,worker 不因单任务崩溃
- 有队列长度保护,避免无限积压
7. 限制与建议
- 无任务优先级
- 无任务超时与取消
- 队列满时仅返回 false,调用方可观测性有限
- 可增强:
- 统计指标(队列长度、活跃线程、任务耗时)
- 拒绝策略(丢弃最旧/调用者执行/阻塞等待)
- 支持 future 返回值接口