使用CreateThreadPool建立執行緒池

餅乾`發表於2022-04-27

使用Windows API函式來建立執行緒池,可以極大的方便了自己編寫執行緒池的繁瑣步驟。

使用CreateThreadPool來建立一個執行緒池,需要在建立完成後,初始化執行緒池的狀態,並且在不需要的時候清理執行緒池所佔用的資源。

相關程式碼:

    auto m_ptp_pool = CreateThreadpool(NULL);            // 建立執行緒池
    SetThreadpoolThreadMaximum(m_ptp_pool, 12);
    SetThreadpoolThreadMinimum(m_ptp_pool, 1);
    InitializeThreadpoolEnvironment(&m_tp_callback_environ);

以上程式碼第一行表示,1.我們建立一個執行緒池,2.設定執行緒池的最大個數,3.設定執行緒池的最小個數,4.設定執行緒池的環境資源物件

在滿足以上條件後我們就可以將我們的任務新增到執行緒池中進行執行。執行緒池的函式要求必須是一個全域性變數。

執行緒池任務函式要求規格:

typedef VOID (NTAPI *PTP_SIMPLE_CALLBACK)(
    _Inout_     PTP_CALLBACK_INSTANCE Instance,
    _Inout_opt_ PVOID                 Context
    );

將任務新增到執行緒池:

if(TrySubmitThreadpoolCallback(func, this, &m_tp_callback_environ)==0)
        m_box.InsertString(0, TEXT("執行緒失敗!"));

func函式示例:

void func(PTP_CALLBACK_INSTANCE a, LPVOID args) {
    CMyMfcSdiView* obj = (CMyMfcSdiView*)args;        // 由於我的測試是在MFC下使用的,故採用MFC物件進行顯示,但是不影響執行緒池的使用
    obj->m_box.InsertString(0, TEXT("執行緒寫入"));
}

使用TrySubmitThreadpoolCallback函式將任務新增到建立好的執行緒池,並且執行緒立即執行。可以多次呼叫該函式將需要的任務新增到執行緒池中執行。

如果我們不再需要執行緒池,需要將執行緒池的環境資源物件釋放,並且關閉執行緒池控制程式碼,來優化系統資源。

    DestroyThreadpoolEnvironment(&m_tp_callback_environ);
    CloseThreadpool(m_ptp_pool);

至此,一個執行緒池的建立,使用,銷燬就結束了,至於API函式的引數型別,可以參考在鍵入api函式時參考引數提示

或者參考以下兩個變數,在上述程式碼中用到:

   PTP_POOL m_ptp_pool;
    TP_CALLBACK_ENVIRON m_tp_callback_environ;

以上測試用例在VS2022中執行,如果您有什麼問題,歡迎提問

相關文章