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