第11章 Windows线程池(3)_私有的线程池

11.3 私有的线程池

11.3.1 创建和销毁私有的线程池

(1)进程默认线程池

当调用CreateThreadpoolwork、CreateThreadpoolTimer、CreateThreadpoolWait或CreateThreadpoolIo,并使传入参数PTP_CALLBACK_ENVIRON设为NULL时,那么所有的工作项将被添加到进程默认的线程池。一般这个默认的线程池能满足大多数应用程序的要求。其生命期与进程相同,在进程终止的时候,Windows负责线程池的清理和销毁工作。

(2)创建私有线程池:PTP_POOL CreateThreadpool(PVOID reserved); //参数为NULL

(3)销毁私有线程池: CloseThreadpool(PTP_POOL pThreadpool);

11.3.2 定制私有线程池

(1)设置线程池中线程的最大数量和最小数量

BOOL SetThreadpoolThreadMinimum(PTP_POOL pThreadpool,DWORD cthrdMin);

BOOL SetThreadpoolThreadMaximum(PTP_POOL pThreadpool,DWORD cthrdMax);

【注意】默认线程池的最小数量为1,最大数量为500

11.3.3 线程池的回调环境(callback environment)——TP_CALLBACK_ENVIRON结构体

(1)初始化回调环境:InitializeThreadpoolEnvironment(PTP_CALLBACK_ENVIRON pcbe);

【说明】初始化的作用是回调环境结构体中的将Version设为1,其余为0。

(2)将回调环境关联到指定的线程池中

  SetThreadpoolCallbackpool(PTP_CALLBACK_ENVIRON pcbe,PTP_POOL pThreadpool);

  【注意】如果不调用该函数,则pbce为NULL。此时向线程池添加的工作项被会添加到进程默认的线程池中。否则被添加到pThreadpool指定的线程池中。

(3)销毁回调环境:DestroyThreadpoolEnvironment(PTP_CALLBACK_ENVIRON pcbe)

11.3.4 清理组——得体地销毁线程池

(1)创建清理组:PTP_CLEANUP_GROUP CreateThreadpoolCleanupGroup();

(2)将清理组与线程池关联:SetThreadpoolCallbackCleanupGroup函数


参数


描述


PTP_CALLBACK_ENVIRON pcbe


清理组与线程池关联是通过这个结构体关联起来的(注意,这个结构中内部PTP_POOL字段指向了我们创建的线程池)


PTP_CLEANUP_GROUP ptpcg


指向由CreateThreadpoolCleanupGroup创建的清理 组。


PTP_CLEANUP_GROUP_CANCEL_CALLBACK pfng


CleanupGroupCancelCallback回调函数。当调用清理组CloseThreadpoolCleanupGroupmembers函数,并为bCancelPendingCallbacks传入TRUE来清除清理组时,如果此时尚有未被处理的工作项时,则要调用这个回调函数,其原型为:

VOID CALLBACK CleanupGroupCancelCallback(

PVOID pvObjectContext,PVOID pvCleanupContext)

其中pvObjectContext是通过CreateThreadpool*函数传入的pvContext,参数pvCleanupContext是由CloseThreadpoolCleanupGroupMembers的pvCleanupContext参数传入的。


备注:

①每当调用CreateThreadpool*等函数(如CreateThreadpoolTimer)时,如果其最后的回调环境参数不为NULL,那么所创建的项会被添加到回调环境的清理组中,表示线程池中新添加了一项,需要潜在的清理

②如果调用CloseThreadpool*(如CloseThreadpoolTimer),那么等于隐式将对应的项从清理组中删除

(3)释放清理组成员:CloseThreadpoolCleanupGroupMembers(相当为清理组的每个工作项调用CloseThreadpool*函数)


参数


描述


PTP_CLEANUP_GROUP ptpcg


指向由CreateThreadpoolCleanupGroup创建的清理 组。


BOOL bCancelPendingCallbacks


是否取消线程池是剩余的工作项。

①如果bCancelPendingCallbacks指定为TRUE,则所有已提交但尚未处理工作项将被直接取消。如果之前在SetThreadpoolCallbackCleanupGroup的pfng指定了回调函数,那么对每一个被取消的项,回调函数pfng都要被调用一次

②如果bCancelPendingCallbacks为FALSE,则在函数返回之前,线程池会花时间来处理队列中剩余的工作项。(这时CleanupGroupCancelCallback函数是不会被调用的,因此pvCleanupContext可设为NULL)


PVOID pvCleanupContext


传给CleanupGroupCancelCallback回调函数的额外参数。如果bCancelPendingCallbacks为FALSE,则CleanupGroupCancelCallback不会被调用,所以该参数可以设为NULL)。


备注:主控线程调用该函数时,该函数会一直等待,直到线程池中所有剩余的工作项都处理完毕才返回。(这点与WaitForThreadpool*函数(如WaitForThreadpoolWork)相似。

(4)销毁清理组:ClosethreadpoolCleanupGroup将清理组本身所占内存释放!

时间: 2024-08-01 07:46:47

第11章 Windows线程池(3)_私有的线程池的相关文章

第11章 Windows线程池(1)_传统的Windows线程池

第11章 Windows线程池 11.1 传统的Windows线程池及API 11.1.1 传统的线程池对象及对应的API 线程池对象 API 普通任务线程池 QueueUserWorkItem 计时器线程池 CreateTimerQueue(创建线程池) CreateTimerQueueTimer(创建计时器) ChangeTimerQueueTimer DeleteTimerQueueTimer DeteTimerQueueEx 同步对象等待线程池 RegisterWaitForSingle

第11章进程间通信(1)_管道

1. 进程间通信概述 (1)概述 ①数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间. ②共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到. ③通知事件:一个进程需要向另一个(组)进程发送消息,通知它们发生了某种事件(如进程终止时要通知父进程). ④资源共享:多个进程之间共享同样的资源.为了做到这一点,需要内核提供锁和同步机制. ⑤进程控制:有些进程希望完全控制另一个进程的执行(如Degub进程),此时控制进程希望能够拦截另

《Android开发艺术探索》第11章 Android的线程和线程池

第11章 Android的线程和线程池 11.1 主线程和子线程 (1)在Java中默认情况下一个进程只有一个线程,也就是主线程,其他线程都是子线程,也叫工作线程.Android中的主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时操作.线程的创建和销毁的开销较大,所以如果一个进程要频繁地创建和销毁线程的话,都会采用线程池的方式.(2)在Android中除了Thread,还有HandlerThread.AsyncTask以及IntentService等也都扮演着线程的角色,只是它们具有不

apue读书笔记 - 第11章 线程

实例11-1 为在Ubuntu12.04上的运行结果与书中描述的不一致呢? 从pid来看这两个线程属于同一个进程,且线程ID也是指针形式的,Google后得知,书上讲的是以前的LinuxThreads实现,现在linux使用NPTL线程. 参考:Linux 线程模型的比较:LinuxThreads 和 NPTL 习题11.4 在回答该问题之前,我觉得得先弄清楚"互斥量"与"条件变量"之间的关系.因为书上说这两者一般是配套使用的. 考虑如下情况: 子线程B和子线程C都

《Unix环境高级编程》读书笔记 第11章-线程

1. 引言 了解如何使用多个控制线程在单进程环境中执行多个任务. 不管在什么情况下,只要单个资源需要在多个用户键共享,就必须处理一致性问题. 2. 线程概念 典型的Unix进程可以看成只有一个控制线程:一个进程在某一时刻只能做一件事情. 多线程带来的好处: 通过为每种事件类型分配单独的处理线程,可以简化处理异步事件的代码.每个线程在进行事件处理时可以采用同步编程模式. 多个进程必须使用操作系统提供的复制机制才能实现内存和文件描述符的共享.而多个线程自动地可以访问相同的存储空间和文件描述符. 有些

第11章线程总结

1 线程标识 pthread_t类型 int pthread_equal(pthread_t tid1,pthread_t tid2) pthread_t pthread_self() 2 创建线程 int pthread_create(pthread_t *tid,pthread_attr_t *attr,void *(*start_rtn)(void *),void *arg) tid保存线程id,attr描述线程属性,start_rtn为线程起始函数(参数和返回值都是void *),arg

第11章 进程与多线程

Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. 二.Jav

C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)

译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 and .NET Core 1.0>.水平有限,各位阅读时仔细分辨,唯望莫误人子弟. 附英文版原文:Professional C# 6 and .NET Core 1.0 - Chapter 39 Windows Services --------------------------------

[转]MySQL性能调优与架构设计&mdash;&mdash;第11章 常用存储引擎优化

第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处.如何将各种存储引擎在自己的应用环境中结合使用,扬长避短,也是一门不太简单的学问.本章选择最为常用的两种存储引擎进行针对性的优化建议,希望能够对读者朋友有一定的帮助. 11.1 MyI SAM存储引擎优化 我们知道,MyISAM存储引擎是MySQL最为古老的存储引擎之一,也是最为流行的存储引擎之一.对