学习teamtalk服务端源码,记录下线程池的实现。
主要是实现的类分为任务类(抽象类)、线程池类、工作线程类、线程同步类。
Task抽象任务类 虚基类为了能够处理不同任务
#ifndef __TASK_H__
#define __TASK_H__
class CTask {
public:
CTask(){}
virtual ~CTask(){}
virtual void run() = 0;
private:
};
#endif /*defined(__TASK_H__) */
线程池类threadPool
init初始化并启动工作线程
int CThreadPool::Init(uint32_t worker_size)
{
m_worker_size = worker_size;
m_worker_list = new CWorkerThread [m_worker_size];
if (!m_worker_list) {
return 1;
}
for (uint32_t i = 0; i < m_worker_size; i++) {
m_worker_list[i].SetThreadIdx(i);
m_worker_list[i].Start();
}
return 0;
}
工作线程创建线程,遍历任务队列并处理。这里遍历任务队列的方式和遍历redis空闲连接队列一样,用一个锁和信号量优雅地等待任务。