Posted on 2009-04-19 21:53
S.l.e!ep.¢% 閱讀(823)
評論(0) 編輯 收藏 引用 所屬分類:
MulThreads
CAll QueueUserWorkItem Function
當?shù)谝淮握{(diào)用 QueueUserWorkItem 時, Windows將創(chuàng)建一個線程池,其中的一個線程將執(zhí)行 Function 函數(shù),函數(shù)執(zhí)行完成后,該線程返回線程池,等待新的任務。由于 Windows 依賴于該過程來完成線程池的功能,因此 Function 中不能有任何中止該線程的調(diào)用,如 ExitThread。 假如當調(diào)用 QueueUserWorkItem 時,沒有可用的線程,Windows 就可以通過創(chuàng)建額外的線程增加線程池中線程的數(shù)量。線程池中的線程的數(shù)量是動態(tài)的,并且受 Windows 的控制,Windows 內(nèi)部的調(diào)度算法決定處理當前線程工作負載的最佳方式。
如果知道所要處理的工作需要很長時間才能完成,可以在調(diào)用 QueueUserWorkItem 時,將參數(shù)的 Flags 設置為 WT_EXECUTELONGFUNCTION ,這時如果線程池中的所有的線程都處于忙狀態(tài), 那么 Windows 將自動創(chuàng)建新的線程。
Windows 線程池中的線程有兩種類型,一種可以用來處理異步I/O, 另一種則不能。前者依賴于IO完成端口,IOCP是一種Windows內(nèi)核對象,它可以將線程和I/O端口綁定在特定的系統(tǒng)資源上,對帶有完成端口的I/O進行處理是一個復雜的過程。
調(diào)用 QueueUserWorkItem 時,需要標識哪些線程執(zhí)行I/O,哪些線程不執(zhí)行I/O, 將 QueueUserWorkItem 中的 Flags 設置成 WT_EXECUTIONDEFAULT, 就可以告訴線程池該線程不執(zhí)行異步I/O,從而可以對其進行相應的管理;對于執(zhí)行異步I/O的線程,則應該將其 Flags 設置為 WT_EXECUTEIONIOTHREAD.