线程池之异步方式调用函数

(一)分类:

  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的时候,系统会在内部以我们的名义分配一个工作项。如果打算提交大量的工作项,那么出于性能和内存使用的考虑,创建工作项一次,并多次提交它会更好。

原文地址:https://www.cnblogs.com/wang-can/p/3340151.html