1. 程式人生 > >C++11實現的執行緒池,可以使用類成員函式來新增執行緒任務

C++11實現的執行緒池,可以使用類成員函式來新增執行緒任務

功能: 

        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()
	{
	}
};