You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinAPI线程池回调函数日志输出异常的技术疑问

WinAPI线程池回调函数日志输出异常的技术疑问

我正在Visual Studio 2022中开发一个使用WinAPI的C应用程序,在使用WinAPI线程池时,遇到了回调函数日志输出(用于调试)的问题。下面是一个简化示例(为了代码更简洁,省略了错误处理):

VOID CALLBACK WorkCallback(PTP_CALLBACK_INSTANCE instance, PVOID parameter, PTP_WORK work)
{
    UNREFERENCED_PARAMETER(instance);
    UNREFERENCED_PARAMETER(parameter);
    UNREFERENCED_PARAMETER(work);
    printf("Hello from WorkCallback\n\r");
}

VOID Test()
{
    printf("Hello from Test\n\r");
    
    TP_CALLBACK_ENVIRON callbackEnviron;
    InitializeThreadpoolEnvironment(&callbackEnviron);

    PTP_POOL pool = CreateThreadpool(NULL);
    SetThreadpoolThreadMinimum(pool, 1);
    SetThreadpoolThreadMaximum(pool, 1);

    SetThreadpoolCallbackPool(&callbackEnviron, pool);

    PTP_CLEANUP_GROUP cleanupGroup = CreateThreadpoolCleanupGroup();
    SetThreadpoolCallbackCleanupGroup(&callbackEnviron, cleanupGroup, NULL);

    PTP_WORK work = CreateThreadpoolWork(WorkCallback, NULL, &callbackEnviron);
    SubmitThreadpoolWork(work);

    CloseThreadpool(pool);
    CloseThreadpoolCleanupGroupMembers(cleanupGroup, FALSE, NULL);
    CloseThreadpoolCleanupGroup(cleanupGroup);
}

int CDECL
main()
{
    Test();
    getchar();
    return 0;
}

当我不调试运行,或者调试但不设置断点时,只能得到输出Hello from Test。我发现唯一能让Hello from WorkCallback打印出来的方法是:在SubmitThreadpoolWork前设置一个断点,在WorkCallback里也设置一个断点,调试时单步进入SubmitThreadpoolWork,并且使用并行堆栈窗口(Debug->Windows->Parallel Stacks)。

让我觉得奇怪的是,仅仅在WorkCallback里设置断点还不够。而且特定调试条件下的行为和常规执行时不一样。在其他一些Stack Overflow问题里,有人提到不同线程可能无法输出到控制台,所以我尝试写入文件,但观察到的行为和之前描述的一样。

我是不是在使用线程池时漏掉了什么?为什么会出现这种情况?

备注:内容来源于stack exchange,提问作者broland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:03:06