线程池

      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请求仍然处于未处理状态。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值