C 11 執行緒池demo

2021-10-07 07:45:51 字數 2048 閱讀 5861

執行緒池:一種執行緒的使用模式,執行緒過多會帶來排程開銷,進而影響快取區域性性和整體效能。而執行緒池維護著多個執行緒,等待著監督管理者分配可併發執行的任務。這避免了在處理短時間任務時建立與銷毀執行緒的代價。執行緒池不僅能夠保證核心的充分利用,還能防止過分排程。可用執行緒數量應該取決於可用的併發處理器、處理器核心、記憶體、網路sockets等的數量。

執行緒池工作原理:

1、主程式當前沒有任務要執行,執行緒池中的任務隊列為空閒狀態.此情況下所有工作執行緒處於空閒的等待狀態,任務緩衝隊列為空.

2、主程式新增小於等於執行緒池中線程數量的任務.所有工作執行緒已處在等待狀態,主線程開始新增小數量任務到佇列,喚醒執行緒池中的執行緒開始取任務執行. 此時的任務緩衝佇列還是空。

3、主程式新增任務數量大於當前執行緒池中線程數量的任務.所有工作執行緒都在工作中,主線程開始新增第四個任務到佇列中,等待工作執行緒空閒後主動從任務佇列取任務執行.

4、主程式新增任務數量大於當前執行緒池中線程數量的任務,且任務緩衝佇列已滿.主程式新增第n個任務,新增後發現池子中的執行緒用完了,訊息佇列也存滿了,於是進入等待狀態、等待任務緩衝佇列中的任務騰空通知.但是要注意這種情形會阻塞主線程。

threadpool.h

#include

#include

#include

#include

#include

#include

#include

#include

#include

class

threadpool

;threadpool::

threadpool

(size_t threads)

:stop

(false))

;//(1)當匿名函式返回false時才阻塞執行緒,阻塞時自動釋放鎖。2)當匿名函式返回true且受到通知時解阻塞,然後加鎖。if(

this

->stop &&

this

->tasks.

empty()

)return

; task = std::

move

(this

->tasks.

front()

);//取出任務

this

->tasks.

pop();

}task()

;//執行}}

);}threadpool::

~threadpool()

condition.

notify_all()

;for

(auto

&worker : workers)

worker.

join()

;}template

<

typename f,

typename..

. args>

auto threadpool::

enqueue

(f&& f, args&&..

. args)

->std::future<

decltype(f

(args...

))>);

} condition.

notify_one()

;return res;

}

main.cpp

#include

#include

#include

#include

"waitgroup.h"

#include

"threadpool.h"

intmain()

));}

for(

auto

&& result : results)

std::cout << result.

get(

)<< std::endl;

}return

0;

C 11執行緒池

執行緒池其實就是把任務佇列和工作執行緒綁到一起,提供乙個向任務佇列中新增任務的介面,下面的 為了表達更加清楚沒有分成標頭檔案和原始檔,僅僅是提供思路。同步機制利用的互斥鎖 條件變數,也可以使用c 11提供的原子數封裝的自旋鎖 條件變數。兩種組合的區別在於,自旋鎖比較適合當任務比較簡單的時候使用,可以...

C 11 執行緒池

根據提出的思路略有改動 已測試 pragma once include include include include include include include include include include include 執行緒池 class threadpool if this task...

C 11 執行緒池實現

c 11中已經新增了跨平台的thread相關工具,在一些輕量級使用場景中,使用std thread無疑會給我們帶來很多方便。這裡使用它實現了乙個簡單的執行緒池 easythreadpool.h ifndef easy thread pool h define easy thread pool h i...