1. 程式人生 > >基於C++11的執行緒池

基於C++11的執行緒池

*需要C++11的支援,在vs2013下編譯通過

執行效果

image

背景

在傳統的收到任務即建立執行緒的情況下,我們每收到一個任務,就建立一個執行緒,執行任務,銷燬執行緒,

我們把這三個過程所用的時間分別記做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:執行緒池類,用於從使用者獲取任務,管理任務,實現對執行緒池中執行緒的排程

類圖如下

MainDig

*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;">
};