Windows核心编程 (4)

线程池

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.按规定的时间间隔调用函数:HANDLE CreateTimerQueue();该函数创建一个定时器队列,定时器队列对一组定时器进行
组织安排。一旦拥有一个定时器队列,就可以在该队列中创建下面的定时器:BOOL CreateTimerQueueTimer(PHANDLE
phNewTimer, HANDLE hTimerQueue,WAITORTIMERCALLBACK pfnCallback,PVOID pvContext,DWORD dwDueTimer,DWORD
dwPeriod,ULONG dwFlags);如果只是创建少数几个定时器,只需要为hTimerQueue参数传递NULL,并且完全避免调用
CreateTimerQueue函数。这会使用默认的定时器队列,并且简化你的代码。工作回调函数必须采用下面的原型: VOID WINAPI
WaitOrTimerCallback(PVOID pvContext,BOOL fTimerOrWatiFired);
dwFlags参数的取值:WT_EXECUTEDEFAULT(用非I/O组件处理工作项目),WT_EXECUTEINIOTHREAD(用I/O组件),
WT_EXECUTEPERSISTENTTHREAD(用定时器),WT_EXECUTELONGFUNCTION(工作项目需要花费较长时间时)
还有一个标志是WT_EXECUTEINTIMERTHREAD,它使定时器组件的线程可以执行工作项目,虽然这可以使工作项目的运行效率更
高,但是这非常危险,如果工作项目长时间中断运行,那么等待定时器的线程就无法执行任何其他操作。如果打算这么做,那
么该代码应该迅速执行,不应该中断。
当不再出发定时器时,必须通过调用下面的函数将它删除:BOOL DeleteTimerQueueTimer(HANDLE hTimerQueue,HANDLE
hTimer, HANDLE hCompletionEvent);
可以调用BOOL ChangeTimerQueueTimer(HANDLE hTimerQueue ,HANDLE hTimer, ULONG dwDueTimer,ULONG dwPeriod);函数来
改变它的到期时间和到期周期。
当要删除定时器队列:BOOL DeleteTimerQueueEX(HANDLE hTimerQueue,HANDLE hCompletionEvent);
4.当某个内核对象变为已通知状态时调用函数: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);
5.当异步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请求仍然处于未处理状态。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值