第十一章 線程池
線程池的目的就是為了減少創(chuàng)建和銷毀線程的額外開銷,利用已經(jīng)存在的線程多次循環(huán)執(zhí)行多個任務從而提高系統(tǒng)的處理能力.
線程池會自動地根據(jù)內(nèi)制的算法增加或減少線程池中的線程或為程序增加新的線程池。
1.異步方法調(diào)用
異步方法調(diào)用有以下兩種方法:
(1)線程函數(shù)原型(回調(diào)函數(shù))
VOID NTAPI SimpleCallback
(
PTP_CALLBACK_INSTANCE pInstance, // See "Callback Termination Actions" section
PVOID pvContext
);
TrySubmitThreadpoolCallback
該函數(shù)將線程函數(shù)執(zhí)行請求發(fā)到線程池,并將一個"工作項目"添加到線程池的隊列中。
注:我們不需要調(diào)用CreateThread函數(shù),線程池中的線程會執(zhí)行我們的回調(diào)函數(shù)
(2)顯示控制"工作項目"
CreateThreadpoolWork 創(chuàng)建一個工作項目
SubmitThreadpoolWork 將工作項目提交到線程池中,一個工作項目可以多次提交到線程池中。
WaitForThreadpoolWorkCallbacks 等待線程函數(shù)執(zhí)行完畢或取消執(zhí)行線程函數(shù)。
CreateThreadpoolWork要求的線程函數(shù)原型:
VOID CALLBACK WorkCallback
(
PTP_CALLBACK_INSTANCE Instance,
PVOID Context,
PTP_WORK Work
);
VOID WaitForThreadpoolWorkCallbacks
(
PTP_WORK pWork,
BOOL bCancelPendingCallbacks
);
2.時間間隔內(nèi)調(diào)用函數(shù)
(1)CreateThreadpoolTimer要求的線程函數(shù)原型
VOID CALLBACK TimeoutCallback
(
PTP_CALLBACK_INSTANCE pInstance, // See "Callback Termination Actions" section
PVOID pvContext,
PTP_TIMER pTimer
);
(2)步驟
CreateThreadpoolTimer
SetThreadpoolTimer
WaitForThreadpoolTimerCallbacks
CloseThreadpoolTimer
3.當內(nèi)核對象處于Signal狀態(tài)時調(diào)用函數(shù)
當指定的內(nèi)核對象變成Signal狀態(tài)或等待超時,線程池會用戶指定的線程函數(shù)。
之后當內(nèi)核對象再次變成Signal狀態(tài)時,線程函數(shù)不會被調(diào)用,除非再次調(diào)用SetThreadpoolWait注冊線程函數(shù)。
(1)CreateThreadpoolWait要求的線程函數(shù)原型
VOID CALLBACK WaitCallback
(
PTP_CALLBACK_INSTANCE pInstance, // See "Callback Termination Actions" section
PVOID Context,
PTP_WAIT Wait,
TP_WAIT_RESULT WaitResult
);
CreateThreadpoolWait
SetThreadpoolWait 不允許多次注冊同樣的Handle,但是我們可以用DuplicateHandle函數(shù)復制一個句柄 然后再注冊。
WaitForThreadpoolWaitCallbacks
CloseThreadpoolWait
4.當異步I/O請求結束后調(diào)用函數(shù)
To be filled
5.回調(diào)終結后的操作和私有線程
To be filled
6. Common API
TrySubmitThreadpoolCallback
CreateThreadpoolWork SubmitThreadpoolWork WaitForThreadpoolWorkCallbacks CloseThreadpoolWork
CreateThreadpoolTimer SetThreadpoolTimer WaitForThreadpoolTimerCallbacks CloseThreadpoolTimer
CreateThreadpoolWait SetThreadpoolWait WaitForThreadpoolWaitCallbacks CloseThreadpoolWait
CallbackMayRunLong DisassociateCurrentThreadFromCallback