Завершается ли эта трассировка стека _NtWaitForSingleObject@12(), указывая на заблокированный или свободный поток?

У меня есть приложение, которое интенсивно использует библиотеку параллельных задач. Когда мое приложение работает, я замечаю, что число потоков, о которых сообщалось, что ProcessExplorer иногда использует для моего приложения более 200 потоков, и в конечном итоге приложение блокируется, когда в нем заканчиваются потоки.

Когда я взял полный DUMP памяти с помощью 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    

Мой вопрос:

Потоки с вышеупомянутой трассировкой стека ждут чего-то, что я начал и впоследствии осиротел? Или эта трассировка стека просто указывает на свободный поток?

1 ответ

Решение

Получается, что WinDbg действительно был лучшим способом получить окончательный ответ на вопрос, что делают все эти потоки.

Как отмечается в "B", "_NtWaitForSingleObject@12 указывает, что поток находится в режиме ожидания, ожидая работы или ожидая планировщика".

Используя команду! Threadpool в WinDbg, следующее ясно показывает, что эти потоки должны принадлежать пулу потоков и что они действительно простаивают:

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
Другие вопросы по тегам