執行緒池-建立到銷燬
建立執行緒池
Windows提供了一個執行緒池機制來簡化執行緒池的建立、銷燬以及日常管理。呼叫執行緒池函式時,系統會為程序建立相應的核心資源,其中一些核心資源在程序終止之前都將一直存在。執行緒池的開銷取決於用法:系統會以程序的名義來分配執行緒、其他核心物件以及內部資料結構。
建立一個新的執行緒池需呼叫函式:
PTP_POOL CreateThreadpool(PVOID reserved);
其中reserved是保留的,應該傳入引數為NULL。返回值為建立的執行緒池值。
為了更好的利用計算機的效能,可以通過系統函式獲取到計算機的引數:
建立好執行緒池之後就可以進行設定執行緒數量。
以非同步方式呼叫函式
為執行執行緒池非同步呼叫函式,需要使用下面函式:
VOID NTAPI SimpleCallback(PTP_CALLBACK_INSTANCE pInstance, PVOID pvContext);
為了讓執行緒池中的一個執行緒執行該函式,需要向執行緒池提交一個請求。
BOOL TrySubThreadpoolCallback(PTP_SIMPLE_CALLBACK pfnCallback, PVOID pvContext, PTP_CALLBAACK_ENVIRON pcbe);
該函式通過將一個工作項新增到執行緒池的佇列中,若呼叫成功,則返回TRUE,呼叫失敗,則返回FALSE。
建立工作項時需要呼叫下面函式:
VOID CALLBACK WorkCallback(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work);
向執行緒池提交請求時,可以使用函式:
VOID SubminThreadpoolWork(PTP_WORK pWork);
如果存在另一個執行緒想要取消已經提交的工作項,或該執行緒由於要等待工作項處理完畢而需要將自己掛起,可以使用下面的函式:
VOID WaitForTreadpoolWorkCallbacks(PTP_WORK pWork, BOOL bCancelPendingCallbacks);
不再需要一個工作項時,可以呼叫下面的函式:
VOID CloseThreadpoolWork(PTP_WORK pwk);
不需要自己呼叫CreateThread。系統會自動為我們建立一個預設的執行緒池,並讓執行緒池中的一個執行緒來呼叫我們的回撥函式。當執行緒處理完一個請求之後,他不會立刻被銷燬,而是會回到執行緒池中,準備處理佇列中的任何其他工作項。執行緒池會不斷地重複使用其中的執行緒,而不會頻繁的建立和銷燬執行緒。
每隔一段時間呼叫一個函式
每個一段時間進行呼叫一個函式相當於程式執行任務是基於一個計時器進行執行。如果使用一個可等待的計時器物件會浪費系統資源,只需要建立一個可等待計時器即可。
在核心物件觸發時呼叫一個函式
核心物件觸發的時機,請參考如下:
核心物件觸發
在非同步I/O請求完成時呼叫一個函式
銷燬執行緒池
當程式需要銷燬執行緒池時,呼叫下面的函式:
VOID CloseThreadpoolGroupMembers(PTP_CLEANUP_GROUP ptpcg, BOOL bCanclePendingCallbacks, PVOID pvCleanupContext);
當bCanclePendingCallbacks為true時,函式會將已經提交但尚未處理的工作項直接取消。
當所有的工作項被取消或處理之後,呼叫下面的函式來釋放清理組所佔用的資源:
VOID WINAPI CloseThreadpoolCleanupGroup(PTP_CLEANUP_GROUP ptpcg);
最後可以呼叫DestroyThreadpoolEnvironment和CloseThreadpool,這樣就完全關閉執行緒池。