基於C++11的執行緒池
*需要C++11的支援,在vs2013下編譯通過
執行效果
背景
在傳統的收到任務即建立執行緒的情況下,我們每收到一個任務,就建立一個執行緒,執行任務,銷燬執行緒,
我們把這三個過程所用的時間分別記做T1,T2,T3
任務本身所用的時間僅佔T2/(T1+T2+T3),這在任務本身所用時間很短的情況下, 效率是很低的
此外,通常作業系統所能建立的執行緒數量都是有限的,並不能無限制的建立執行緒。
而線上程池中,我們通常會預先建立m個執行緒,放到空閒容器中,當有任務來臨時,執行緒池會從空閒的執行緒中挑選一個執行緒來執行該任務,
在執行完畢後再將其放回空閒容器中
C++11
在C++11中,C++對執行緒提供了一個很高的抽象,並沒有很好的提供優先順序控制等功能,需要呼叫std::thread::native_handle(),獲取原生執行緒物件
執行平臺特定的操作,但這就喪失了std::thread在不同平臺上程式碼層面的一致性。
所以在專案中實現了對std::thread二次封裝,並提供了基本的優先順序控制
專案概述
專案中有一個主執行緒,即執行程式時建立的執行緒可以從使用者那裡獲取任務,還有一個管理執行緒,用於進行執行緒池中執行緒的排程,還有初始化執行緒池時建立的若干空閒執行緒,用於執行任務
專案中主要有以下幾個類:
Task:任務類,內有任務的優先順序,和一個純虛Run方法,我們需要派生Task,將要完成的任務寫到Run方法中
MyThread:執行緒類,封裝了C++11的thread,每一個執行緒可以關聯一個Task物件,執行其Run方法
BusyThreadContainer:工作容器類,採用std::list<MyThread*>實現,儲存工作狀態的執行緒
IdleThreadContainer:空閒容器類,採用std::vector<MyThread*>實現,儲存處於空閒狀態的執行緒
TaskContainer:任務容器類,採用priority_queue<Task*>實現,儲存所有使用者新增未執行的任務
MyThreadPool:執行緒池類,用於從使用者獲取任務,管理任務,實現對執行緒池中執行緒的排程
類圖如下
*UserTask為使用者自己編寫的從Task派生的任務類
Task類
namespace { enum PRIORITY {MIN </span>= <span style="color: #800080;">1</span>, NORMAL = <span style="color: #800080;">25</span>, MAX = <span style="color: #800080;">50</span><span style="color: #000000;"> };