最近一段時間在看linux下c語言的多執行緒,其中乙個比較重要的應用就是執行緒池。自己也參照著網上的資料寫了乙個簡單的執行緒池。這裡做以總結。
我們的應用在任何時候都要準備應對數目巨大的連線請求,同時,這些請求所要完成的任務卻又可能非常的簡單,即只占用很少的處理時間。
總之執行緒池通常適合下面的幾個場合:
(1) 單位時間內處理任務頻繁而且任務處理時間短
(2) 對實時性要求較高。如果接受到任務後在建立執行緒,可能滿足不了實時要求,因此必須採用執行緒池進行預建立。
(3) 必須經常面對高突發性事件,比如web伺服器,如果有足球轉播,則伺服器將產生巨大的衝擊。此時如果採取傳統方法,則必須不停的大量產生執行緒,銷毀執行緒。此時採用動態執行緒池可以避免這種情況的發生。
目的很明確,為了減少建立銷毀帶來的開銷,尤其是當執行緒的任務簡單的時候。
一般來說,執行緒池都是
採用預建立的技術,在應用啟動之初便預先建立一定數目的執行緒。
應用在執行的過程中,需要時可以從這些執行緒所組成的執行緒池裡申請分配乙個空閒的執行緒,來執行一定的任務。
任務完成後,並不是將執行緒銷毀,而是將它返還給執行緒池,由執行緒池自行管理。如果執行緒池中預先分配的執行緒已經全部分配完畢,但此時又有新的任務請求,則執行緒池會動態的建立新的執行緒去適應這個請求。
當然,有可能,某些時段應用並不需要執行很多的任務,導致了執行緒池中的執行緒大多處於空閒的狀態,為了節省系統資源,執行緒池就需要動態的銷毀其中的一部分空閒執行緒。
因此,執行緒池都需要乙個管理者,按照一定的要求去動態的維護其中執行緒的數目。
建立的執行緒都要從這裡開始執行。
threadroutine()
if(!notshutdown) /// 在這裡結束任務。
if(queuesize > 0)
else
}}
標頭檔案
/**
purpose : 基本執行緒池
實現緩衝外部高併發任務數
author : oslo wang
data : 2015 05 19
next version : 這裡沒有實現對執行緒池裡執行緒的動態管理。
如果空閒執行緒多,則銷毀一些。
如果等待的任務多,則建立一些執行緒。
*/#include #include /// 採用c++ stl中的佇列來管理任務。
using std::queue;
/// 執行緒任務結構體
typedef struct st_threadmission
threadmission;
threadmission * createthreadmission(void* (*process) (void *), void *arg);
/// 簡單執行緒池類
class cthreadpool
;//void * threadroutine(void *arg);
int threadpool_test();
實現
#include "threadpool.h"
#include #include cthreadpool::cthreadpool(int maxthread)
cthreadpool::~cthreadpool()
bool cthreadpool::initpool(int maxthread)
}return true;
}bool cthreadpool::destrpool()
delete threadid;
threadid = null;
threadmission *ptr = null;
int queuenum = missionqueue.size();
for(i = 0; i < queuenum; ++i)
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&hasmission);
return true;
}void cthreadpool::addmission(threadmission * mission)
void * cthreadpool::threadroutine(void *arg)
/**執行緒在這裡銷毀*/
if(ptr->isshutdown)
threadmission * mission = null;
if(ptr->missionqueue.size() > 0)
else
}pthread_exit(null);
return null;
}char argstring[5][256] = ;
void * myprocess(void *arg)
threadmission * createthreadmission(void* (*process) (void *), void *arg)
int threadpool_test()
sleep(10);
return 0;
}
使用執行緒池 3
對比建立500個執行緒和將500個執行緒放入執行緒池中。發現建立500個執行緒消耗了大量的作業系統資源,消耗的時間段 而把執行緒放到執行緒池中節省了記憶體和執行緒數,但是執行的時間變長了。using system using system.diagnostics using system.threa...
執行緒 執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...
執行緒 執行緒池
乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...