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