最近項目需要用到線程池,以前沒接觸過,斷斷續續學了兩三個星期吧
先在網上找了一個用C實現的,例子挺多,不過我只看了一個
http://www.linuxidc.com/Linux/2013-01/77619.htm
我覺得寫得比較簡潔易懂
項目是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_ */