c 實現執行緒池

2021-05-25 11:36:00 字數 3414 閱讀 1792

執行緒池:簡單地說,執行緒池 就是預先建立好一批執行緒,方便、快速地處理收到的業務。比起傳統的到來乙個任務,即時建立乙個執行緒來處理,節省了執行緒的建立和**的開銷,響應更快,效率更高。

在linux中,使用的是posix執行緒庫,首先介紹幾個常用的函式:

1 執行緒的建立和取消函式

pthread_create 建立執行緒

pthread_join  等待執行緒結束

pthread_cancel  取消執行緒

2 執行緒同步函式

pthread_mutex_lock

pthread_mutex_unlock  鎖

pthread_cond_signal

pthread_cond_wait  訊號量

執行緒池的實現:

執行緒池的實現主要分為三部分,執行緒的建立、新增任務到執行緒池中、工作執行緒從任務佇列中取出任務進行處理。

主要有兩個類來實現,ctask,cthreadpool

/**執行任務的類,設定任務資料並執行

**/c++**

class ctask 

ctask(string taskname) 

virtual int run()= 0; 

void setdata(void* data);    //設定任務資料 

}; 

任務類是個虛類,所有的任務要從ctask類中繼承 ,實現run介面,run介面中需要實現的就是具體解析任務的邏輯。m_ptrdata是指向任務資料的指標,可以是簡單資料型別,也可以是自定義的複雜資料型別。

執行緒池類

/**執行緒池

**/c++**

class cthreadpool 

;  當執行緒池物件建立後,啟動一批執行緒,並把所有的執行緒放入空閒列表中,當有任務達時.某乙個執行緒取出任務並進行處理。

執行緒之間的同步用執行緒鎖和條件變數。

這個類的對外介面有兩個:

1.addtask函式把任務新增到執行緒池的任務列表中,並通知執行緒進行處理。當任務到到時,把任務放入m_vectasklist任務列表中,並用pthread_cond_signal喚醒乙個執行緒進行處理。

2.stopall函式停止所有的執行緒

cpp**

cthread.h

#ifndef __cthread 

#define __cthread 

#include

#include

#include

using namespace std; 

/**

執行任務的類,設定任務資料並執行

**/ 

class ctask 

ctask(string taskname) 

virtual int run()= 0; 

void setdata(void* data);    //設定任務資料 

}; 

/**

執行緒池

**/ 

class cthreadpool 

;   

#endif 

cthread.cpp 

#include "cthread.h" 

#include

#include

using namespace std; 

void ctask::setdata(void * data) 

vectorcthreadpool::m_vecbusythread; 

vectorcthreadpool::m_vecidlethread; 

pthread_mutex_t cthreadpool::m_pthreadmutex = pthread_mutex_initializer; 

pthread_cond_t cthreadpool::m_pthreadcond = pthread_cond_initializer; 

cthreadpool::cthreadpool(int threadnum) 

int cthreadpool::movetoidle(pthread_t tid) 

busyiter++; 

}  m_vecbusythread.erase(busyiter); 

m_vecidlethread.push_back(tid); 

return 0; 

}  int cthreadpool::movetobusy(pthread_t tid) 

idleiter++; 

}  m_vecidlethread.erase(idleiter); 

m_vecbusythread.push_back(tid); 

return 0; 

}  void* cthreadpool::threadfunc(void * threaddata) 

ctask* task = *iter; 

tasklist->erase(iter); 

pthread_mutex_unlock(&m_pthreadmutex); 

cout << "idel thread number:" << cthreadpool::m_vecidlethread.size() << endl; 

cout << "busy thread number:" << cthreadpool::m_vecbusythread.size() << endl; 

//cout << "task to be run:" << tasklist->size() << endl; 

task->run(); 

//cout << "cthread::thread work" << endl; 

cout << "tid:" << tid << " idle" << endl; 

}  return (void*)0; 

}  int cthreadpool::addtask(ctask *task) 

int cthreadpool::create() 

return 0; 

}  int cthreadpool::stopall() 

iter = m_vecbusythread.begin(); 

while(iter != m_vecbusythread.end()) 

return 0; 

}  簡單示例: 

××××××××test.cpp 

#include "cthread.h" 

#include

using namespace std; 

class cworktask: public ctask 

int run() 

};int main() 

while(1) 

return 0; 

}

c 執行緒池實現(四)執行緒池實現

前面已經說到了同步佇列的實現,下面來看執行緒池的實現。ifndef include threadpool define include threadpool include include include include include syncqueue.hpp namespace mythrea...

C 執行緒池實現

最近在學習stanford的cs149課程,這個課程是有關平行計算的,講了很多很有用的知識,在做程式設計作業的過程中也遇到了很多困難,看了很多資料,我將它們整理出來,以後看也方便一些。執行緒池的具體實現就是將執行緒提前建立好放入vector等容器中,等到有任務的時候就執行緒就取出任務執行,沒有任務就...

C 實現執行緒池

3.thread用法總結 執行緒池的作用 管理乙個任務佇列,乙個執行緒佇列,每次取乙個任務分配有乙個執行緒,迴圈往復。參考 c 簡單執行緒池實現 show the code include pthread mutex t lock pthread mutex initializer pthread ...