(一)分类:
1、不创建工作项的方式
2、通过创建一个工作项的方式
(二)不创建工作项的方式
步骤:
1、写一个类似void NTAPI SimpleCallback(PTP_CALLBACK_INSTANCE pInstance,PVOID pvContext),名字可以自己写
2、TrySubmitThreadpoolCallback,通过这个函数,将一个工作项添加到线程池的队列中。
代码:
#include <iostream>
#include <afx.h>
using namespace std;
void NTAPI SimpleCallback(PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext)
{
cout << "线程ID: " << GetCurrentThreadId() << endl;
}
void main()
{
TrySubmitThreadpoolCallback(SimpleCallback, NULL, NULL);
Sleep(1000); //确定用同一个线程来执行
TrySubmitThreadpoolCallback(SimpleCallback, NULL, NULL);
Sleep(1000); //确保2个线程都能够被执行
}
结果:
思考:
其实我们还可以不用第一个Sleep,我们会发现线程ID是不同的。这就更加证明了这是一个线程池。
(三)创建一个工作项的方式
步骤:
1、写一个类似void NTAPI SimpleCallback(PTP_CALLBACK_INSTANCE pInstance, PVOID pvContext, PTP_WORK Work)名字可以自己写
2、CreateThreadpoolWork,创建一个工作项
3、SubmitThreadpoolWork,提交请求
4、CloseThreadpoolWork,关闭工作项
代码:
#include <iostream>
#include <afx.h>
using namespace std;
void NTAPI SimpleCallback(PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext, PTP_WORK Work)
{
cout << "线程ID: " << GetCurrentThreadId() << endl;
}
void main()
{
PTP_WORK pWork = CreateThreadpoolWork(SimpleCallback, NULL, NULL);
SubmitThreadpoolWork(pWork);
Sleep(1000); //确定用同一个线程来执行
SubmitThreadpoolWork(pWork);
SubmitThreadpoolWork(pWork);
Sleep(1000); //确保线程函数都能够被执行
CloseThreadpoolWork(pWork);
}
结果:
思考:
《Windows核心编程》:每一次调用TrySubmitThreadpoolCallback的时候,系统会在内部以我们的名义分配一个工作项。如果打算提交大量的工作项,那么出于性能和内存使用的考虑,创建工作项一次,并多次提交它会更好。