多线程 - 线程池的使用

Windows提供了线程池机制,可以直接调用相关API使用。

先介绍一种最简单的线程池API的使用。

1、TrySubmitThreadpoolCallback

TrySubmitThreadCallback函数是向线程池提交一个请求,请求让线程池中的线程执行某个函数。该函数的函数原型如下所示:

BOOL TrySubmitThreadpoolCallback(

        PTP_SIMPLE_CALLBACK    pfnCallBack,    //请求调用的回调函数

        PVOID                  pvContext,      //向回调函数传递的参数

        PTP_CALLBACK_ENVIRON   pcbe            //可以通过该参数定制线程池,一般置为NULL

        );

 其中pfnCallBack必须是满足一下原型的函数

VOID NTAPI SimpleCallback(

            PTP_CALLBACK_INSTANCE pInstance,

            PVOID pvContext                    //传递的参数

            );

 

实例如下所示:

#include <Windows.h>   //Must be included

#include <map>

using namespace std;

map<DWORD, DWORD> g_map;
DWORD g_CurrentTask = 0;

void NTAPI SimpleCallBack(PTP_CALLBACK_INSTANCE pInstance, PVOID pvContext)
{
        int k = *(int *)pvContext;

        //printf(">>> k: %d\n", k);

        InterlockedIncrement(&g_CurrentTask); //自动递增全局任务计数器,以原子量的方式实现

        DWORD threadID = GetCurrentThreadId(); //获取当前任务的线程ID号

        g_map[threadID] = g_CurrentTask;

        printf(">>> 【%d】- %d 线程开始运行!\n", threadID, g_CurrentTask);

        Sleep(g_CurrentTask * 1000);    //Do Something ...

        printf(">>> 线程 %d 执行完毕!\n", g_map[GetCurrentThreadId()]);

        if( InterlockedDecrement(&g_CurrentTask) == 0 )       //当该任务执行完毕后,就自动递减全局任务计数器

        {
               printf(">>> 所有线程均已执行完毕!\n");
        }
        return;
}

int _tmain(int argc, _TCHAR* argv[])
{
        // 向线程池提交申请
         int i = 0;
        for(i = 0; i < 10; i++)
        {
               Sleep(10);

               //BOOL rBet = TrySubmitThreadpoolCallback(SimpleCallBack, NULL, NULL);
               BOOL rBet = TrySubmitThreadpoolCallback(SimpleCallBack, (PVOID)&i, NULL);

               if(!rBet)
               {
                       printf(">>> ERROR: 向线程池提交申请失败!\n");
               }

               else
               {
                       //printf(">>> 向线程池提交申请成功!\n");
               }
        }
        getchar();
        return 0;
}

 

 程序执行结果如下所示:

https://img-blog.csdnimg.cn/20190319163053319.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JhaWxhbmdfemhpenVu,size_16,color_FFFFFF,t_70

2、

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章