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
相关产品推荐
相关产品推荐

