C++11實現的執行緒池,可以使用類成員函式來新增執行緒任務
阿新 • • 發佈:2019-01-27
功能:
1:可以使用類成員函式/全域性函式單獨的建立一個執行緒,可以帶多個引數。
2:可以使用類成員函式/全域性函式單獨的為執行緒池新增一個任務,可以帶多個引數。
3:執行緒池的執行緒數量可手動擴充套件,稍作修改可以修改為自動擴充,由大家看需要進行更改,這裡只做拋磚引玉。
下載地址:https://download.csdn.net/download/j506825719/10332456
使用方法:
ThreadPoolTool::StartThread(this, &FileTool::onReachedBottom,1,"2");//靜態函式,獨立為成員函式開啟一個執行緒,後面的1,"2"最後的是引數 ThreadPoolTool::StartThread(this, &FileTool::onReachedBottom);//靜態函式,獨立為成員函式開啟一個執行緒,沒有引數 ThreadPoolTool::StartThread(onReachedBottom,1,"2");//靜態函式,獨立為非成員函式開啟一個執行緒,後面的1,"2"最後的是引數 ThreadPoolTool::StartThread(onReachedBottom);//靜態函式,獨立為非成員函式開啟一個執行緒,沒有引數 ThreadPoolTool tt;//預設的無引數構造方法,執行緒池的執行緒數量時CPU核心的2倍 //ThreadPoolTool *tt=new ThreadPoolTool(20);有引數構造方法,指定執行緒池的執行緒數量 tt.AddTask(this, &FileTool::onReachedBottom,1,"2");//新增一個成員函式的執行緒任務,後面的1,"2"最後的是引數 tt.AddTask(this, &FileTool::onReachedBottom);//新增一個成員函式的執行緒任務,沒有引數 tt.AddTask(onReachedBottom,1,"2");//新增一個非成員函式的執行緒任務,後面的1,"2"最後的是引數 tt.AddTask(onReachedBottom);//新增一個非成員函式的執行緒任務,沒有引數 int num = tt.getCurrentThreadPoolSize();//獲取當前執行緒池的執行緒數量 num = tt.getDefaultThreadPoolSize();//獲取預設執行緒池的執行緒數量 tt.SetThreadCount(num);//設定執行緒池的執行緒數量 tt.ChangeThreadNum(num);//加減執行緒池的數量,正數就增加執行緒,負數就減少
類介面:
#pragma once #include <Windows.h> #include <functional> #include <queue> class ThreadPoolTool { public: //預設無參建構函式 //預設執行緒池執行緒數量為CPU核心的兩倍 ThreadPoolTool(){ }; //有參建構函式,被無參建構函式呼叫 ThreadPoolTool(int tempDefaultThreadPoolSize) { }; //靜態函式,獨立的建立一個執行緒,函式是類成員函式 template<typename xClass, typename xReturn, typename...xParam> static HANDLE StartThread(xClass* pThis, xReturn(xClass::* pfn)(xParam...), xParam...lp) { } //靜態函式,獨立的建立一個執行緒,非類成員函式 template<typename xReturn, typename...xParam> static HANDLE StartThread(xReturn(*pfn)(xParam...), xParam...lp) { } //為執行緒池新增一個成員函式的執行緒任務 template<typename xClass, typename xReturn, typename...xParam> void AddTask(xClass* pThis, xReturn(xClass::* pfn)(xParam...), xParam...lp) { } //為執行緒池新增一個成員函式的執行緒任務 template<typename xReturn, typename...xParam> void AddTask(xReturn(*pfn)(xParam...), xParam...lp) { } //為執行緒池新增一個執行緒任務 void AddTask(std::function<void()> t) { } //修改執行緒池的執行緒數量,可為正數,負數 void ChangeThreadNum(int changeNum) { } //停止執行緒池 void StopThreadPool() { } //設定執行緒池數量 void SetThreadCount(int count) { } //獲取當前的執行緒池的執行緒數量 int getCurrentThreadPoolSize() { } //獲取當前的執行緒池的預設執行緒數量 int getDefaultThreadPoolSize() { } private: std::function<void()> t; std::queue<std::function<void()>> m_taskQueue; CRITICAL_SECTION ThreadPoolSection; int defaultThreadPoolSize = 0; int currentThreadPoolSize = 0; HANDLE TaskSemaphoreCount; HANDLE ExitSemaphoreCount; ThreadPoolTool(std::function<void()> Tasktemp) { } static DWORD WINAPI Thread(LPVOID lp) { } void ThreadPoolTask() { } };