1

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

当我使用 AdPlus 对内存进行 FULL DUMP 并在 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    

我的问题是:

具有上述堆栈跟踪的线程是否正在等待我启动并随后成为孤立的东西?还是该堆栈跟踪仅指示空闲线程?

4

1 回答 1

1

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

正如 B 所说,'_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
于 2016-02-24T23:47:48.110 回答