1.线程池包括四种组件:定时器,等待,I/O, 非I/O
2.异步调用函数:BOOL QueueUserWorkItem(PTHREAD_START_ROUTINE pfnCallback, PVOID pvContext, ULONG dwFlags);
该函数将一个工作项目排队放入线程池种的一个线程中并立即返回。所谓工作项目是指pfnCallback函数,它被调用并传递单
个参数pcContext。回调函数必须采用下面的原型:
DWORD WINAPI WorkItemFunc(PVOID pvContext);
注:你自己不必调用CreateThread。系统会自动为你的进程创建一个线程池,相线程池中的一函数将调用你的函数。
如果想要给发出异步I/O请求的工作项目排队,可以位dwFlags参数传递WT_EXECUTEINIOTHREAD。
如果想使用永久线程池的线程来调用这些函数中的一个,可以使用WT_EXECUTEINPERSISTENTTHREAD标志,它使定时器组件的线程能够执行已排队的工作项目回调函数。
由于定时器组件的线程决不会终止运行,因此可以确保最终发生异步操作。
如果工作项目需要花费很长的时间来运行,那么可以传递一个WT_EXECUTELONGFUNCTION标志。该标志能够帮助线程池决定是否要添加新线程,如果线程池中的所有线程都处于繁忙状态,它就会强制线程池创建一个新线程。
3.当某个内核对象变为已通知状态时调用函数:BOOL RegisterWaitForSingleObject(PHANDLE phNewWaitObject,HANDLE
hObject, WAITORTIMERCALLBACK pfnCallback, PVOID pvContext, ULONG dwMilliseconds, ULONG dwFlags);
回调函数的原型:VOID WINAPI WaitOrTimerCallbackFunc( PVOID pvContext,BOOLEAN fTimerOrWaitFired);
取消等待组件的注册状态:BOOL UnregisterWaitEx( HANDLE hWaitHandle, HANDLE hCompletionEvent);
4.当异步I/O请求完成运行时调用的函数:
BOOL BindIoCompletionCallback(
HANDLE hDevice,
POVERLAPPED_COMPLETION_ROUTINE pfnCallback,
ULONG dwFlags);
VOID WINAPI OverlappedCompletionRoutine(
DWORD dwErrorCode,
DWORD dwNumberOfBytesTransferred,
POVERLAPPED pOverlapped);
6.注意:如果发出I/O请求的线程终止运行,该I/O请求也会被撤销。另外,非I/O组件中的线程是根据工作量来创建或撤销的
,如果工作量很小,该组件中的线程就会终止运行,其I/O请求仍然处于未处理状态。