翻譯by lwkl
a programming model to use a thread pool by sherwoodhu
許多場合我們需要利用多執行緒來提高我們系統的行為。每個線程式幾乎相同,但我們必須管理這些執行緒。如果當系統繁忙了,那麼我們將建立更多的線程式,不然我們殺掉一寫來避免額外的負擔。
我做了些涉及到多線程式管理的工作,最終我決定寫乙個來包裝這些機制的類。此類能動態的分配執行緒和分配工作給這些執行緒。你只需要派生你自己的類,而並不需要知道內部的機制是如何操控制這多個執行緒和同步這些執行緒的。然而你必須保證你的工作類必須是執行緒安全的,原因是你的工作每時每刻都可能會被分派給不同的線程式。
要使用這個執行緒池類你必須從
iworker
介面派生你的工作(
work
)類,從
ijobdesc
派生你的任務描述(
job)類。工作的邏輯必須被包括在成員函式iworker::processjob(ijobdesc* pjob)
.
,此後,你能像這樣宣告乙個執行緒池:
cthreadpool pool;
pool.start(6, 10);
//do some other jobs here
pool.stop();
start
函式擁有
2個引數,第乙個引數是執行緒池產生的最少執行緒個數。第
2個引數指出最多工作執行緒的可能數。一方面如果線程式池非常繁忙,它就會自動產生更多的線程式,另一方面,當執行緒池空閒時,一些執行緒就會從池中被移走。好好設定這
2個引數以便達到更好的表現。
如果想分配給工作給執行緒池,那麼你只需簡單的呼叫以下函式
pool.processjob(pjob, pworker);
你必須確保你繼承的類是執行緒安全的,因為有可能乙個工作例項可能同時工作在多執行緒裡,你在任何情況下都無法得知工作是否工作在相同執行緒裡。
如果你個工作過程非常耗時,那當你呼叫
stop
函式的時候,工作並不會立即停止。
stop
函式將最多等待超過
2分鐘然後返回。此函式有乙個可選引數,如果引數設定為
true
,函式不管怎樣都會停止這些工作執行緒。如果引數設定為
false
,調這些工作執行緒將不會被野蠻的終止而回繼續處在活動狀態,在此情況下,你必須小心對待這些工作物件,當你呼叫
stop()
後,如過你試圖接近他們有可能你將會得到乙個訪問錯誤。
job物件必須有
new操作符在堆上產生。結束後他將回自動被框架內部
delete
。sherwood hu
有記憶體洩露
當我使用時候有一些記憶體洩露
atl server提供他自己的執行緒池類。
vs7及起以上版本,你可以使用內部的類
atl::cthreadpool.
工作原型以模板提供,應用
3個共用方法和乙個
typedef
定義工作專案。他非常通用,簡單和速度快。當編寫
windows
程式使用此類代替。
修正bug
hi首先非常感謝你分享你的**
我想有一點
bug當
workerproc
接近(process
)removethread
資訊(0xfffffffe
)的時候
.,當執行緒接受到這個訊息時候,整個的過程結束,線程式被終止。我們並不知道
processjob
有沒有完成。
所以我像這樣修正了
修正原位址
還有另外乙個人做了些修正
詳細請看位址
另外乙個問題,此處完成埠使用執行緒池的技術並不是先建立乙個完成埠然後將他和乙個控制代碼聯絡起來。而是使用了先建立乙個完成埠,以後所有的工作都使用postqueuedcompletionstatus 來傳遞引數和進行執行緒池內活動。大家看**時候要注意下
乙個執行緒池 ThreadPool 的使用
1 步驟一 include threadpool.h 2 步驟二 從irunobject派生自己的處理類 class cmyrunobject public irunobject bool autodelete void deleteinstance 派生類中必須實現的函式 run,initiali...
執行緒池(一) 實現乙個簡單的執行緒池
我們知道頻繁的建立 銷毀執行緒是不可取的,為了減少建立和銷毀執行緒的次數,讓每個執行緒可以多次使用,我們就可以使用執行緒池,可以降低資源到的消耗。執行緒池裡面肯定有多個執行緒,那麼我們就簡單的用乙個陣列來儲存執行緒,那我們我們預設裡面有 5 個執行緒。那我們執行緒池裡只有五個執行緒能同時工作,那同時...
實現乙個執行緒池
一.執行緒最主要的三個同步機制 1.訊號量 2.互斥鎖 3.條件變數 二.對三個同步機制分別實現乙個包裝類 ifdef locker h define locker h include include 訊號量的封裝 class sem sem bool wait bool post private ...