ThreadPool 是 ZLToolKit 的线程管理核心,基于生产者-消费者模型实现任务队列调度。本文深入分析其任务入队、线程获取、负载均衡和优雅退出机制。
1. 类继承关系
TaskExecutorInterface (纯虚接口) └─ TaskExecutor (加入 CPU 负载计算) └─ ThreadPool (线程池实现) └─ EventPoller (IO 事件轮询器,后续文章分析)2. TaskExecutorInterface — 抽象接口
classTaskExecutorInterface{public:virtual~TaskExecutorInterface()=default;// 异步投递任务virtualTask::Ptrasync(TaskInCB&&task,boolmay_sync=true)=0;// 同步执行任务(阻塞等待完成)virtualvoidsync(constfunction<void()>&task){semaphore sem;async([&](){task();sem.post();},false);sem.wait();}// 延时执行任务virtualDelayTask::PtrdoDelayTask(uint64_tdelay_ms,function<uint64_t()>&&task)=0;};sync 实现巧妙:用 semaphore 将异步任务转为同步等待——投递任务后sem.wait()阻塞,任务执行完sem.post()唤醒。
3. TaskExecutor — 任务执行器
classTaskExecutor:publicThreadLoadCounter,publicTaskExecutorInterface{public:usingPtr=std::shared_ptr<TaskExecutor>;// 获取 CPU 负载floatonLoad()const{returnThreadLoadCounter::onLoad();}// 获取当前线程的任务执行器staticTaskExecutor*getCurrentTaskExecutor();private:// 线程局部存储staticthread_localTaskExecutor*s_current_task_executor;};thread_local保存当前线程的任务执行器指针,使任意代码可以getCurrentTaskExecutor()获取所属执行器——这是线程归属机制的底层支撑。
4. ThreadPool — 线程池核心
4.1 核心数据成员
classThreadPool:publicTaskExecutor{