Windows提供了线程池机制,可以直接调用相关API使用。
先介绍一种最简单的线程池API的使用。
1、TrySubmitThreadpoolCallback
TrySubmitThreadCallback函数是向线程池提交一个请求,请求让线程池中的线程执行某个函数。该函数的函数原型如下所示:
BOOL TrySubmitThreadpoolCallback(
PTP_SIMPLE_CALLBACK pfnCallBack, //请求调用的回调函数
PVOID pvContext, //向回调函数传递的参数
PTP_CALLBACK_ENVIRON pcbe //可以通过该参数定制线程池,一般置为NULL
);
其中pfnCallBack必须是满足一下原型的函数
VOID NTAPI SimpleCallback(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext //传递的参数
);
实例如下所示:
#include <Windows.h> //Must be included
#include <map>
using namespace std;
map<DWORD, DWORD> g_map;
DWORD g_CurrentTask = 0;
void NTAPI SimpleCallBack(PTP_CALLBACK_INSTANCE pInstance, PVOID pvContext)
{
int k = *(int *)pvContext;
//printf(">>> k: %d\n", k);
InterlockedIncrement(&g_CurrentTask); //自动递增全局任务计数器,以原子量的方式实现
DWORD threadID = GetCurrentThreadId(); //获取当前任务的线程ID号
g_map[threadID] = g_CurrentTask;
printf(">>> 【%d】- %d 线程开始运行!\n", threadID, g_CurrentTask);
Sleep(g_CurrentTask * 1000); //Do Something ...
printf(">>> 线程 %d 执行完毕!\n", g_map[GetCurrentThreadId()]);
if( InterlockedDecrement(&g_CurrentTask) == 0 ) //当该任务执行完毕后,就自动递减全局任务计数器
{
printf(">>> 所有线程均已执行完毕!\n");
}
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
// 向线程池提交申请
int i = 0;
for(i = 0; i < 10; i++)
{
Sleep(10);
//BOOL rBet = TrySubmitThreadpoolCallback(SimpleCallBack, NULL, NULL);
BOOL rBet = TrySubmitThreadpoolCallback(SimpleCallBack, (PVOID)&i, NULL);
if(!rBet)
{
printf(">>> ERROR: 向线程池提交申请失败!\n");
}
else
{
//printf(">>> 向线程池提交申请成功!\n");
}
}
getchar();
return 0;
}
程序执行结果如下所示:
2、