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、

多线程 - Windows下线程池的使用相关推荐

  1. linux下c语言线程传参数,【linux】C语言多线程中运行线程池,在线程池中运行线程池,,传递的结构体参数值为空/NULL/0...

    C语言多线程中运行线程池,在线程池中运行线程池,,传递的结构体参数值为空/NULL/0 本贴问题,之前已经提问过一次,当时已经解决了,原贴在这里https://segmentfault.com/q/1 ...

  2. windows下线程创建

    windows下线程创建: CreateThread()函数是Windows提供的API接口 1.HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTESlp ...

  3. Java多线程系列--“JUC线程池”06之 Callable和Future

    转载自  Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...

  4. linux下线程池实现

    linux下线程池实现 转自:http://blog.csdn.net/lmh12506/article/details/7753952 前段时间在github上开了个库,准备实现自己的线程池的,因为 ...

  5. 为什么用线程池?解释下线程池参数?线程池处理流程?阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?线程池中线程复用原理?

    为什么用线程池?解释下线程池参数? 1.降低资源消耗:提高线程利用率,降低创建和销毁线程的消耗. 2.提高响应速度:任务来了,直接有线程可用可执行,而不是先创建线程,再执行. 3.提高线程的可管理性: ...

  6. 20170916_Linux下线程池技术

    20170916_Linux下线程池技术 1.问题的起因: (1)在服务器程序中,经常是每当来一个客户端的连接请求时,服务器主线程就会创建一个与之对应的子线程来为这个客户端进行服务,也就是进行数据的I ...

  7. 为什么用线程池?解释下线程池参数? -- Java面试

    为什么用线程池 降低资源消耗.提高线程利用率,降低创建和小回县城的损耗. 提高响应速度.任务来了,直接有线程可用,而不是先创建线程再执行. 提高线程的可管理性.使用线程池可以统一分配调优监控. 解释下 ...

  8. Java 进阶——多线程优化之线程池 ThreadPoolExecutor的使用(三)

    引言 前面花了很多时间把线程池的核心容器和主要核心流程源码大概的分析了一遍,如果有认真看了的话相信,一定对于线程池有了较深的理解,ThreadPoolExecutor是线程池框架的一个核心类,通过对T ...

  9. 简述Linux C下线程池的使用

    线程池也是多线程的处理方式.是将"生产者"线程提出任务添加到"任务队列",然后一些线程自动完成"任务队列"上的任务. 多线程编程,创建一个线 ...

最新文章

  1. 图像分割20年,盘点影响力最大的10篇论文
  2. java调用可执行文件
  3. 数据中心节能改造刻不容缓成本高昂怎么破?
  4. 3.11 随机初始化
  5. Java包装器类及自动装箱(自动打包)
  6. 使用Android OpenGL ES 2.0绘图之四:应用投影和相机视图
  7. “我爱淘”冲刺阶段Scrum站立会议3
  8. firewalld-富规则使用内容事项:
  9. 2017-2018-2 PDE 讨论班
  10. 声明式编程思想和EEPlat
  11. Spring Boot(四)—— Spring MVC自动配置
  12. Ubuntu VirtualBox 安装问题解决
  13. 84键键盘没有insert键
  14. Vue <transition> 多个组件的过渡案例
  15. APP软件测试点着重详解
  16. 【生活中的逻辑谬误】质的量化和以出身论英雄
  17. 【神经网络第三期】RBF神经网络基本原理和模型应用
  18. 计算机领域英文单词怎么读
  19. android简单文件管理器源码,文件管理器-android源代码
  20. 手机吃鸡语音服务器异常是怎么回事,绝地求生语音卡怎么办_绝地求生新版本语音卡解决办法介绍_游戏吧...

热门文章

  1. 中山大学计算机英才计划,2021广东省英才计划入选名单出炉!哪些学校在神仙打架?...
  2. hisi及unbuntu编译opencv
  3. table如何设置边框
  4. linux 命令——su和sudo
  5. linux方向键ascii_Linux终端下的退格和删除键^H ^? ^[[3~ 杂记
  6. XSS bypass
  7. [调试]_[初级]_[Windbg使用教程]
  8. html div tooltip,css实现toolTip
  9. 基于nodejs的预约上门维修服务系统
  10. VC2010无法启动程序,系统找不到指定文件