zhiyang0 2013-01-10
最近项目需要用到线程池,以前没接触过,断断续续学了两三个星期吧
先在网上找了一个用C实现的,例子挺多,不过我只看了一个
我觉得写得比较简洁易懂
项目是C++写的,用的ACE框架,而且系统不算小,如果直接用C的话可能会破坏系统原有的封装和扩展性
可能会用ACE的ACE_TASK来实现线程池,但在此之前我想先自学一下基于pthread的C++的线程池实现
在网上也找到挺多C++的例子,不过都不全,有下到一个源码(网址忘记保存了,下次找到再补上)但完全没有讲解,就自己仿着重写了一个
声明:本文适合用过pthread和一定的C++面向对象编程经验的人。本人菜鸟,难免错漏,望能指正
本代码在Ubuntu12.04下用Eclipse for c++编写,编译的时候需要添加pthread的库
由于代码比较多,因此我先贴一个大致的流程图上来
1.在main函数中新建一个MyThreadPool对象,并对其进行初始化,新建N个子线程
2.子线程里面循环判断成员m_pJob是否为空,不为空则向下执行,运行m_pJob完毕后让该子线程从BusyList移到IdleList
3.main函数中新建Job对象(你真正想运行的东西),并把它加入线程池中,并与某子线程绑定,同时让该子线程从IdleList移到BusyList
小结一句:其实在线程池中Busy与Idle线程的本质区别是其成员job是否为空
代码本来不算多,但因为有多个类,所以看起来会比较辛苦,先贴上类图
接下来正式贴代码,注释不多,但也不复杂
代码比较多,但重点看MyThread,MyWorkThread和MyThreadPool这3个类就行了
首先是MyThread类
MyThread.h
#ifndef MYTHREAD_H_
#define MYTHREAD_H_
#include <cassert>
#include "pthread.h"
class MyThread {
public:
MyThread();
virtual ~MyThread();
virtual void Run(void) = 0;
bool Create(MyThread* thread);
unsigned long GetThreadID(void){return m_ThreadID;}
protected:
static void* ThreadRoutine(void*);
private:
pthread_t* m_pThread;
unsigned long m_ThreadID;
};
#endif /* MYTHREAD_H_ */