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

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页