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