线程池之异步方式调用函数
(一)分类:
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的时候,系统会在内部以我们的名义分配一个工作项。如果打算提交大量的工作项,那么出于性能和内存使用的考虑,创建工作项一次,并多次提交它会更好。