线程池函数允许我们做:
1.以异步方式调用函数  //工作项
2.每隔一段时间调用一个函数 //计时项
3.在内核对象触发时调用一个函数 //等待项
4.在异步I/O请求完成时调用一个函数 //I/O项

2.每隔一段时间调用一个函数
如果两个:周期的每隔5-7秒执行一段代码,周期的每隔6-8秒执行一段代码。
不用线程池将有两个线程执行,上下文切换不好,如用线程池,系统可能选择6秒间隔只唤醒一个线程执行这两段代码。

3.在内核对象触发时调用一个函数
同上类似,各个线程WaitForSingleObject各自的内核对象,如用线程池用一个线程WaitForMultipleObjects 最多MAXIMUM_WAIT_OBJECTS个内核对象
一旦回调函数被调用过,必须SetThreadpoolWait再注册下,否则 等待项 是不活跃状态不会再调用回调函数

#include <Windows.h>// C RunTime Header Files
#include <string>PTP_WORK g_pWorkItem = NULL;
volatile LONG g_nCurrentTask = 0;void NTAPI TaskHandler(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work)
{LONG currentTask = InterlockedIncrement(&g_nCurrentTask);wprintf(L"[%u] Task #%u is starting.\n", GetCurrentThreadId(), currentTask);// Simulate a lot of workSleep(currentTask * 1000);wprintf(L"[%u] Task #%u is done.\n", GetCurrentThreadId(), currentTask);InterlockedDecrement(&g_nCurrentTask);
}void Work(void)
{// Create the work item that will be used by all tasks//(1)create 线程池工作项g_pWorkItem = CreateThreadpoolWork(TaskHandler, NULL, NULL);if (g_pWorkItem == NULL) {wprintf(L"Impossible to create the work item for tasks.\n");return;}wprintf(L"----Start a new batch----\n");for(int i = 4; i > 0; --i){//(2)submit workSubmitThreadpoolWork(g_pWorkItem);}wprintf(L"4 tasks are submitted.\n");//Waits for outstanding work callbacks to complete and optionally cancels pending callbacks that have not yet started to execute.//(3)wait for work overWaitForThreadpoolWorkCallbacks(g_pWorkItem,FALSE);// Don't forget to delete the work item//(4)delete work itemCloseThreadpoolWork(g_pWorkItem);
}PTP_TIMER g_timer = NULL;
volatile LONG g_nSecLeft = 10;
VOID CALLBACK TimeoutCallback(PTP_CALLBACK_INSTANCE pInst, PVOID pvContext, PTP_TIMER pTimer)
{LONG current = InterlockedDecrement(&g_nSecLeft);if(current == 0){SetThreadpoolTimer(g_timer,NULL,0,0); //pftDueTime为NULL时,将停止调用定时器函数wprintf(L"time out----\n");}else{wprintf(L"[%u] call timer callback function #%u is left.\n", GetCurrentThreadId(), current);}
}void Timer(void)
{g_timer = CreateThreadpoolTimer(TimeoutCallback,NULL,NULL);// Start the timer in one second to trigger every 1 secondULARGE_INTEGER ulRelativeStartTime;ulRelativeStartTime.QuadPart = (LONGLONG) -1;  // start nowFILETIME ftRelativeStartTime;ftRelativeStartTime.dwHighDateTime = ulRelativeStartTime.HighPart;ftRelativeStartTime.dwLowDateTime  = ulRelativeStartTime.LowPart;SetThreadpoolTimer(g_timer, &ftRelativeStartTime, 1000, // Triggers every 1000 millisecondsINFINITE//0);//WaitForThreadpoolTimerCallbacks(g_timer,FALSE); //Why this will fail?getchar();CloseThreadpoolTimer(g_timer);
}VOID NTAPI pttwaitcallback(_Inout_     PTP_CALLBACK_INSTANCE Instance,_Inout_opt_ PVOID                 Context,_Inout_     PTP_WAIT              Wait,_In_        TP_WAIT_RESULT        WaitResult)
{wprintf(L"waitResult is WAIT_OBJECT_0 + %d.\n",WaitResult);
}void WaitKernelObject()
{PTP_WAIT pwait = CreateThreadpoolWait(pttwaitcallback,NULL,NULL);HANDLE hEvent1 = CreateEventW(NULL,FALSE,FALSE,L"event1");HANDLE hEvent2 = CreateEventW(NULL,FALSE,FALSE,L"event2");SetThreadpoolWait(pwait,hEvent1,NULL);SetEvent(hEvent1);   //here will make pwait 不活跃状态, 此状态不会再去调回调函数。getchar();SetThreadpoolWait(pwait,hEvent2,NULL);  //不活跃状态后需要重新设置SetEvent(hEvent2);//WaitForThreadpoolWaitCallbacks(pwait,FALSE);getchar();CloseThreadpoolWait(pwait);
}
int wmain()
{//Work();Timer();//WaitKernelObject();wprintf(L"it is over\n");getchar();return(0);
}

线程池之工作项,等待项,计时项 (存在疑问???)相关推荐

  1. Java线程池的工作原理与实现

    简单介绍 创建线程有两种方式:继承Thread或实现Runnable.Thread实现了Runnable接口,提供了一个空的run()方法,所以不论是继承Thread还是实现Runnable,都要有自 ...

  2. Java 线程池的工作原理

    文章目录 概念 线程中的基本方法 线程复用 线程池的核心组件和核心类 线程池的工作原理 线程池中的workQueue任务队列 直接提交队列(SynchronousQueue) 有界任务队列(Array ...

  3. 一文读懂线程池的工作原理(故事白话文)

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 前言 本 ...

  4. java并发编程——线程池的工作原理与源码解读

    2019独角兽企业重金招聘Python工程师标准>>> 线程池的简单介绍 基于多核CPU的发展,使得多线程开发日趋流行.然而线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以 ...

  5. Java并发编程-线程池底层工作原理

    线程池底层工作原理 1.线程池的底层工作流程 1.1.线程池的底层工作原理图 1.2.银行办理业务案例 1.3.线程池的底层工作流程总结 2.线程池用哪个?生产中如何设置合理参数 2.1.在工作中单一 ...

  6. java 工作池_Java线程池的工作原理,好处和注意事项

    线程池的工作原理 一个线程池管理了一组工作线程, 同时它还包括了一个用于放置等待执行 任务的任务队列(阻塞队列) . 一个线程池管理了一组工作线程, 同时它还包括了一个用于放置等待执行 任务的任务队列 ...

  7. 全面解读Java线程池的工作原理

    目录 一.为什么引入线程池技术? 二.Executor框架 2.1 Runnable.Callable与Future接口 2.2 Executor接口 2.2.1 Executor 2.2.2 Exe ...

  8. 彻底搞懂Java线程池的工作原理

    一.线程池的基础知识 创建线程需要占用一定的操作系统资源,在高并发情况下,频繁的创建和销毁线程会大量消耗CPU和内存资源,对程序性能造成很大的影响.为了避免这一问题,Java提供了线程池(通过线程复用 ...

  9. 一文读懂线程池的工作原理

    前言 本文以程序员做需求的例子,比喻线程池的工作过程.以故事白话的方式展开,跟大家阐述线程池工作原理,以方便大家更好理解线程池,谢谢阅读哈~ 什么是线程池? 什么是核心线程? 什么是阻塞队列? 什么是 ...

  10. java线程池的工作原理_JAVA线程池原理详解一

    线程池的优点 1.线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用. 2.可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃. 线 ...

最新文章

  1. ubuntu 禁用透明大页_Linux关于透明大页的使用与禁用介绍
  2. Google Test
  3. 爬虫系统Lucene分词
  4. html中写css代码,开发DIV CSS时 先写CSS代码还是先写HTML代码
  5. 清华大学《操作系统》(七):虚拟存储、覆盖、交换
  6. 十二、一篇文章帮助你快速读懂MySQL索引(B树、B+树详解)
  7. 小球进盒子C语言,N个小球放进M个盒子算法-Go语言中文社区
  8. 羊皮卷的故事-第十七章-羊皮卷之十
  9. JavaScript——事件,DOM,Browser Object Model 浏览器对象模型,电灯开关,HTML DOM,表单动态添加
  10. vb连接mysql_vb.net连接mysql 数据库方法
  11. linux下rar下载地址,linux下rar解压(rarlinux下载,安装 ,使用)
  12. Android 计算视频的fps
  13. java 实现微信公众号开发服务器认证
  14. 微信刷票怎么查实_怎么检查“微信公众平台投票”是否有刷票?
  15. leetcode (Image Smoother)
  16. 用matlab画脑图,思维导图怎么画,画出一副好看的流程图方法是什么
  17. 判断web网站是否站库分离
  18. VBA提高篇_12_1 VBA判断奇偶数的方法
  19. “区块链技术创新要植根市场”
  20. Linux平台常用终端指令合集【超级全】

热门文章

  1. MSSql-SP_who分析数据库性能
  2. POJ1195Mobile phones
  3. 前端开发代码架构相关想法
  4. html5media.js 让浏览器兼容VideoAudio 标签
  5. 高级停靠(Dock)技术的实现
  6. iOS UITableView
  7. hdu 4268 Alice and Bob(STL版)
  8. C++:类中的赋值函数
  9. Linux 服务器带宽异常跑满分析解决
  10. (chap4 IP协议) 路由控制( Routing)