Windows提供了一个线程池机制来简化线程的创建、销毁及管理工作。有以下情形可使用线程池:
1. 以异步的方式来调用一个函数;
1)首先定义一个回调函数,函数原型:
void NTAPI SimpleCallback(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext);
2)为了让线程池中的一个线程执行上面的回调函数,需调用下面的函数向线程池提交一个请求:
BOOL TrySubmitThreadpoolCallback(
PTP_SIMPLE_CALLBACK pfnCallback,
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
2.每隔一段时间调用一个函数 ;
1)首先定义一个回调函数,函数原型:void CALLBACK T imeoutCallback(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext,
PTP_TIMER pTimer);
2) 调用下面函数告知线程池在何时调用回调函数:
PTP_TIMER CreateThreadpoolTimer(
PTP_TIMER_CALLBACK pfnTimerCallback,
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
3) 当想向线程池注册计时器时应调用下面的函数:
VOID SetThreadpoolTimer(
PTP_TIMER pTimer,
PFILETIME pftDueTime,
DWORD msPeriod,
DWORD msWindowLength);
3.当内核对象触发的时候调用一个函数;
1)首先定义一个回调函数,函数原型:void CALLBACK WaitCallback(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext,
PTP_WAIT Wait,
TP_WAIT_RESULT WaitResult);
2) 调用下面函数来创建一个线程池等待对象:
PTP_WAIT CreateThreadpoolWait(
PTP_WAIT_CALLBACK pfnWaitCallback,
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
3) 调用下面的函数将一个内核 绑定到这个线程池:
VOID SetThreadpoolWait(
PTP_WAIT pWaitItem,
HANDLE hObject,
PFILETIME pftTimeout`);
4.当异步I/O请求完成的时候调用一个函数。
1) 指定一个回调函数,函数原型:
VOID CALLBACK OverlappedCompletionRoutine(
PTP_CALLBACK_INSTANCE pInstance,
PVOID pvContext,
PVOID pOverlapped,
ULONG IoResult,
ULONG NumberOfBytesTransferred,
PTP_IO pIo);
2)调用下面的函数创建一个线程池I/O对象:
PTP_IO CreateThreadpoolIo(
HANDLE hDevice,
PTP_WIN32_IO_CALLBACK pfnIoCallback,
PVOID pvContext,
PTP_CALLBACK_ENVIRON pcbe);
3)调用下面的函数将设备线程池内部的I/O完成端口关联起来:
VOID StartThreadpoolIo(PTP_IO pio);
4)调用下面的函数让线程池停止调用回调函数:
VOID CancelThreadpoolIo(PTP_IO pio);
5)调用下面的函数解除文件/设备与线程池I/O完成端口的关联:
VOID CloseThreadpoolIo(PTP_IO pio);