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