Threadpool 线程池
C++ 后端服务器框架Threadpool 线程池
CHAPTER 12

Threadpool 线程池

2 分钟阅读 · 430 字

对应文件:

  • 接口: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 实现细节(模板,头文件)

流程:

  1. 加锁
  2. 若 running_ == false 返回 false
  3. 若 tasks_.size() >= maxTasks_ 返回 false
  4. 入队:
    • 无参数任务:直接 emplace(避免某些编译器对 bind 推导问题)
    • 有参数任务:std::bind(...) 后 emplace
  5. 解锁后 notify_one
  6. 返回 true

5. 并发语义

  • 生产者:调用 addTask
  • 消费者:worker 线程
  • 条件变量用于“无任务阻塞、有任务唤醒”
  • 通过 running_ + 队列空判断实现有序退出

6. 优点

  • 结构清晰,代码短小
  • 异常隔离,worker 不因单任务崩溃
  • 有队列长度保护,避免无限积压

7. 限制与建议

  • 无任务优先级
  • 无任务超时与取消
  • 队列满时仅返回 false,调用方可观测性有限
  • 可增强:
    • 统计指标(队列长度、活跃线程、任务耗时)
    • 拒绝策略(丢弃最旧/调用者执行/阻塞等待)
    • 支持 future 返回值接口
全部章节