码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-09-20 14:42:00      阅读:351      评论:0      收藏:0      [点我收藏+]

标签:

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将清理组本身所占内存释放!

 

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

标签:

原文地址:http://www.cnblogs.com/5iedu/p/4823362.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!