使用CreateThreadPool創建執行緒池

使用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中運行,如果您有什麼問題,歡迎提問