c++ - 如何使用Win32线程池API?

标签 c++ winapi threadpool

此版本(基于 this 文章)有效:

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

VOID
CALLBACK
MyWorkCallback(
    PTP_CALLBACK_INSTANCE Instance,
    PVOID                 Parameter,
    PTP_WORK              Work
)
{
    // Instance, Parameter, and Work not used in this example.
    UNREFERENCED_PARAMETER(Instance);
    UNREFERENCED_PARAMETER(Parameter);
    UNREFERENCED_PARAMETER(Work);

    DWORD threadId = GetCurrentThreadId();

    BOOL bRet = FALSE;

    //
    // Do something when the work callback is invoked.
    //
    {
        _tprintf(_T("MyWorkCallback: ThreadId = %d Task performed.\n"), threadId);
    }

    return;
}

int main()
{
    TP_CALLBACK_ENVIRON CallBackEnviron;
    PTP_POOL pool = NULL;
    PTP_CLEANUP_GROUP cleanupgroup = NULL;
    PTP_WORK_CALLBACK workcallback = MyWorkCallback;
    PTP_TIMER timer = NULL;
    PTP_WORK work = NULL;


    InitializeThreadpoolEnvironment(&CallBackEnviron);
    pool = CreateThreadpool(NULL);
    SetThreadpoolThreadMaximum(pool, 1);
    SetThreadpoolThreadMinimum(pool, 3);
    cleanupgroup = CreateThreadpoolCleanupGroup();
    SetThreadpoolCallbackPool(&CallBackEnviron, pool);
    SetThreadpoolCallbackCleanupGroup(&CallBackEnviron, cleanupgroup, NULL);
    work = CreateThreadpoolWork(workcallback, NULL, &CallBackEnviron);
    for (int i = 0; i < 10; ++i)
    {
        SubmitThreadpoolWork(work);
    }
}

但是,这个版本也可以工作(具有与上面相同的工作功能):

int main()
{
    PTP_WORK = CreateThreadpoolWork(workcallback, NULLPTR, NULLPTR);
    for (int i = 0; i < 10; ++i)
    { 
        SubmitThreadpoolWork(work);
    }
}

两个版本之间有什么区别(最小和最大线程数除外)?
为什么我要使用一个版本而不是另一个版本?

最佳答案

InitializeThreadpoolEnvironment 的文档对此进行了介绍。 :

Create a callback environment if you plan to call one of the following functions to modify the environment:

  • SetThreadpoolCallbackCleanupGroup

  • SetThreadpoolCallbackLibrary

  • SetThreadpoolCallbackPool

  • SetThreadpoolCallbackPriority

  • SetThreadpoolCallbackRunsLong

如果您需要一个或多个列出的函数提供的功能,那么您需要创建一个回调环境。如果你不这样做,你就不会。

如果在开始新项目时有疑问,请从简单的方法开始,看看它是否满足您的需求。如果有必要,您可以随时返回并切换到更复杂的变体。

关于c++ - 如何使用Win32线程池API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44867465/

相关文章:

c++ - 协助 C++ 程序分析

c++ - 使用 Flex 和 Bison 将 Makefile 转换为 CMake

c++ - 如何通过 DbgHelp 获取局部变量的值

java - 如何等到数据接收并完全处理后,再发送下一组数据请求?

c++ - 复制的可执行文件是否会在没有库的情况下在新机器上运行

c++ - 检查给定用户配置文件在 C++ 中是否处于事件状态或已删除的最佳方法是什么?

在调用 CloseHandle 之前调用 GetHandleInformation

multithreading - C++11线程池——带输入参数的任务

java - 具有持久工作实例的线程池

c++ - 将 QMultiSampleAntiAliasing 添加到 QForwardRenderer