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

(一)分类:

  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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值