Завершается ли эта трассировка стека _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