歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

基於pthread的線程池,C++實現

最近項目需要用到線程池,以前沒接觸過,斷斷續續學了兩三個星期吧

先在網上找了一個用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_ */

Copyright © Linux教程網 All Rights Reserved