Posted on 2009-04-19 21:53
S.l.e!ep.¢% 阅读(806)
评论(0) 编辑 收藏 引用 所属分类:
MulThreads
CAll QueueUserWorkItem Function
当第一次调用 QueueUserWorkItem 时, Windows将创建一个线程池,其中的一个线程将执行 Function 函数,函数执行完成后,该线程返回线程池,等待新的任务。由于 Windows 依赖于该过程来完成线程池的功能,因此 Function 中不能有任何中止该线程的调用,如 ExitThread。 假如当调用 QueueUserWorkItem 时,没有可用的线程,Windows 就可以通过创建额外的线程增加线程池中线程的数量。线程池中的线程的数量是动态的,并且受 Windows 的控制,Windows 内部的调度算法决定处理当前线程工作负载的最佳方式。
如果知道所要处理的工作需要很长时间才能完成,可以在调用 QueueUserWorkItem 时,将参数的 Flags 设置为 WT_EXECUTELONGFUNCTION ,这时如果线程池中的所有的线程都处于忙状态, 那么 Windows 将自动创建新的线程。
Windows 线程池中的线程有两种类型,一种可以用来处理异步I/O, 另一种则不能。前者依赖于IO完成端口,IOCP是一种Windows内核对象,它可以将线程和I/O端口绑定在特定的系统资源上,对带有完成端口的I/O进行处理是一个复杂的过程。
调用 QueueUserWorkItem 时,需要标识哪些线程执行I/O,哪些线程不执行I/O, 将 QueueUserWorkItem 中的 Flags 设置成 WT_EXECUTIONDEFAULT, 就可以告诉线程池该线程不执行异步I/O,从而可以对其进行相应的管理;对于执行异步I/O的线程,则应该将其 Flags 设置为 WT_EXECUTEIONIOTHREAD.