WindowsAPI 创建线程池

创建线程池步骤:

1.创建新的线程池 createThreadpool 函数 (threadpoolapiset.h)
2.设置指定线程池可分配给进程回调的最大线程数setThreadpoolThreadMaximum 函数 (threadpoolapiset.h)
3.设置指定线程池必须可用于处理回调的最小线程数SetThreadpoolThreadMinimum 函数 (threadpoolapiset.h)
4.创建回调环境initializeThreadpoolEnvironment 函数 (winbase.h)
5.将池与回调环境相关联setThreadpoolCallbackPool 函数 (winbase.h)
6.进程结束,释放线程池closeThreadpool 函数 (threadpoolapiset.h)

关键函数:

CreateThreadpool()

PTP_POOL CreateThreadpool( PVOID reserved);
//参数是保留的,必须为 NULL
//如果函数成功,返回指向表示新分配线程池的TP_POOL结构的指针,应用程序不会修改此结构的成员
//如果函数失败,它将返回 NULL,可调用 GetLastError获取错误码

GetSystemInfo()

void GetSystemInfo( LPSYSTEM_INFO lpSystemInfo);
//Win32 API:得到当前系统的信息

trySubmitThreadpoolCallback 函数 (threadpoolapiset.h)

BOOL TrySubmitThreadpoolCallback(
  [in]                PTP_SIMPLE_CALLBACK  pfns,
  [in, out, optional] PVOID                pv,
  [in, optional]      PTP_CALLBACK_ENVIRON pcbe
);
//请求线程池工作线程调用指定的回调函数
//pfns : 设置回调函数
//py:    回调函数实例
//pcbe:  线程池的环境

CloseThreadpool()

void CloseThreadpool([in, out] PTP_POOL ptpp);
如果没有未完成 的工作、 I/O、 计时器或 等待 绑定到池的对象,线程池将立即关闭;否则,在释放未完成的对象后,线程池将异步释放。
//若要编译使用此函数的应用程序,请将_WIN32_WINNT定义为0x0600或更高版本。

WindowsAPI 创建线程池

#ifndef CThreadPool_H
#define CThreadPool_H
#include <Windows.h> //C++ 进行 Windows 开发线程池环境
#include <thread>
#include <vector>
#include <memory>
#include <mutex>
#include <iostream>

struct MyTask
{
	std::string szName = "";
	int iID = 0;
};
//如果应用程序调用TrySubmitThreadpoolCallback函数来启动工作线程,则应用程序实现此回调SimpleCallback
//Instance: 占位符
//Context: 传过来的内容
void CALLBACK SimpleCallback(PTP_CALLBACK_INSTANCE Instance, PVOID Context)
{
	std::cout << "Enter SimpleCallback" << std::endl;
}

class CThreadPool
{
public:
	CThreadPool(void) {};
	virtual ~CThreadPool(void) { Shutdown(); };

	void Start(void)
	{
		m_objPool = CreateThreadpool(NULL);
		if (nullptr == m_objPool){return;}
		if (!SetThreadpoolThreadMinimum(m_objPool, 1)){return;}
		SYSTEM_INFO m_scSystemInfo;
		GetSystemInfo(&m_scSystemInfo);
		int iNumberOfCPUCores = m_scSystemInfo.dwNumberOfProcessors;   //dwNumberOfProcessors:系统中的处理器的数目
		std::cout << "Number Of CPU Cores: " << iNumberOfCPUCores << std::endl;
		SetThreadpoolThreadMaximum(m_objPool, iNumberOfCPUCores);

		InitializeThreadpoolEnvironment(&m_scPCBE);
		SetThreadpoolCallbackPool(&m_scPCBE, m_objPool);        //如果未指定线程池,则使用全局线程池
	}
	void Shutdown(void) 
	{
		DestroyThreadpoolEnvironment(&m_scPCBE);
		CloseThreadpool(m_objPool);
	}
	void RunTask(const MyTask& stMyTask)
	{
		std::unique_lock<std::mutex> TaskLock(m_TaskListMutex);
		m_vecTaskList.push_back(stMyTask);
		if (!TrySubmitThreadpoolCallback(SimpleCallback, nullptr, &m_scPCBE))   //启动工作线程
		{
			std::cout << "TrySubmitThreadpoolCallback failed." << std::endl;
		}
	}

private:
	std::mutex m_TaskListMutex;
	std::vector<MyTask> m_vecTaskList;
	PTP_POOL m_objPool = nullptr;
	TP_CALLBACK_ENVIRON m_scPCBE;
};
#endif // CThreadPool_H
#include "CThreadPool.h"
int main()
{
	CThreadPool m_objThreadPool;
	m_objThreadPool.Start();
	MyTask stMyTask{ "ZhangSan",201 };
	int iCount = 10;
	for (int i = 0; i<iCount;++i)
	{
		m_objThreadPool.RunTask(stMyTask);
	}
	system("pause");
	m_objThreadPool.Shutdown();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qzy0621

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值