使用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中运行,如果您有什么问题,欢迎提问

相关