此堆栈跟踪是否以 _NtWaitForSingleObject@12() 结尾,表示阻塞或空闲线程?

Is this stack trace ending with _NtWaitForSingleObject@12() indicating a blocked or an idle thread?

我有一个大量使用任务并行库的应用程序。当我的应用程序运行时,我注意到 ProcessExplorer 报告的线程数有时会超过我的应用程序的 200 个线程,最终应用程序将在线程用完时锁定。

当我使用 AdPlus 获取内存的完整转储并在 Visual Studio 中打开它时,我当时看到了 82 个线程 运行(尽管当时 ProcessExplorer 报告超过 100 个)。

其中许多线程(其中 42 个)仅显示以下堆栈跟踪:

ntdll.dll!_NtWaitForSingleObject@12()  + 0x15 bytes 
ntdll.dll!_NtWaitForSingleObject@12()  + 0x15 bytes 
kernel32.dll!@BaseThreadInitThunk@12()  + 0x12 bytes    
ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes   
ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes    

我的问题是:

具有上述堆栈跟踪的线程是否正在等待我开始并随后孤立的东西? 堆栈跟踪是否仅指示 idle 线程?

事实证明,WinDbg 确实是对所有这些线程正在做什么的问题获得明确答案的最佳方式。

如 theB 所述,“_NtWaitForSingleObject@12 表示线程空闲等待工作或等待调度程序”

使用 WinDbg 中的 !threadpool 命令,下面清楚地表明这些线程必须由线程池拥有并且它们确实处于空闲状态:

0:073> !threadpool
CPU utilization: 21%
Worker Thread: Total: 256 Running: 2 Idle: 254 MaxLimit: 1023 MinLimit: 256
Work Request in Queue: 0
--------------------------------------
Number of Timers: 1
--------------------------------------
Completion Port Thread:Total: 1 Free: 1 MaxFree: 4 CurrentLimit: 1 MaxLimit: 1000 MinLimit: 256