TeamTalk 线程池详解

1.简介

使用现有线程库(pthread.h)实现一个工作线程池,工作线程使用std::list实现任务队列,使用条件变量来解决生产者消费者的竞争问题

2.类说明

  • CTask
// 抽象类,所有任务的基础类,子类重写run方法,来调用任务处理函数。
class CTask {
public:
    CTask(){}
    virtual ~CTask(){}
    
    virtual void run() = 0;
private:
};
  • CThreadNotify
//将pthread.h库里的锁和条件变量封装成方便线程库使用的接口
class CThreadNotify
{
public:
	CThreadNotify();
	~CThreadNotify();
	void Lock() { pthread_mutex_lock(&m_mutex); }
	void Unlock() { pthread_mutex_unlock(&m_mutex); }
	void Wait() { pthread_cond_wait(&m_cond, &m_mutex); }
	void Signal() { pthread_cond_signal(&m_cond); }
private:
	pthread_mutex_t 	m_mutex;
	pthread_mutexattr_t	m_mutexattr;
    
	pthread_cond_t 		m_cond;
};
  • CWorkerThread
// 工作线程,使用std::list作为任务队列,PushTask向队列里添加任务,内部条件变量会被唤醒(CThreadNotify);
//Start会创建线程消耗队列里的任务,同时没有任务时线程会被阻塞,等待条件变量唤醒(CThreadNotify)
class CWorkerThread {
public:
	CWorkerThread();
	~CWorkerThread();

	static void* StartRoutine(void* arg);

	void Start();
	void Execute();
	void PushTask(CTask* pTask);

	void SetThreadIdx(uint32_t idx) { m_thread_idx = idx; }
private:

	uint32_t		m_thread_idx;
	uint32_t		m_task_cnt;
	pthread_t		m_thread_id;
	CThreadNotify	m_thread_notify;
	list<CTask*>	m_task_list;
};
  • CThreadPoo
//Init(uint32_t worker_size)会创建指定数量的工作线程(new CWorkerThread [m_worker_size])形成线程池,同时Init会逐一启动线程池里工作线程;
//AddTask(CTask* pTask)用于添加任务,并随机分发某一个工作线程里去执行
class CThreadPool {
public:
	CThreadPool();
	virtual ~CThreadPool();

	int Init(uint32_t worker_size);
	void AddTask(CTask* pTask);
	void Destory();
private:
	uint32_t 		m_worker_size;
	CWorkerThread* 	m_worker_list;
};

3.源码

  • 链接:TeamTalk_BlueBling/threadpool
  • 本项目主要为了学习teamtalk,尽量将每个细化模块独立出来并编写测试用例,方便移植。
  • 测试demo: tests/test_threadpool.cpp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值