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