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获取错误码
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;
}