почему дополнительный рабочий поток создается во время запуска процесса? - PullRequest
0 голосов
/ 13 февраля 2011

Я запускаю простое консольное приложение Windows: - Когда элемент управления приходит в главное, я сбрасываю стек -

_ Стек моего основного потока:

5840    0   Main Thread Main Thread Normal


console.exe!wmain(int argc=1, wchar_t * * argv=0x006831a0)

console.exe!__tmainCRTStartup()  

console.exe!wmainCRTStartup()

kernel32.dll!@BaseThreadInitThunk@12()

ntdll.dll!___RtlUserThreadStart@8()

ntdll.dll!__RtlUserThreadStart@8()  

__

Вышесказанное хорошо, почему я вижу это при запуске ??:

3740    0   Worker Thread   Win32 Thread Normal

Стек:

ntdll.dll!_KiFastSystemCallRet@0()  
ntdll.dll!_ZwDelayExecution@8()
ntdll.dll!__LdrpInitialize@8()
ntdll.dll!_LdrInitializeThunk@8()

1 Ответ

1 голос
/ 13 февраля 2011

LdrInitializeThunk - это метод для установки нового потока.Я создал с VS2008 простое консольное приложение Win32 (без MFC, ATL) и получил только один поток.Только когда я присоединяю отладчик, я получаю второй, потому что отладчик внедряет поток, чтобы включить отладку процесса.Запуск процесса подробно описан в книге здесь , где ничего не сказано о том, что необходим второй поток.Асинхронные вызовы процедур APC также не виноваты.Возможно, ваш стек вызовов создан не со всеми загруженными символами, и вы ошибочно полагаете, что вспомогательный поток отладчика является скрытым потоком внутри вашего приложения.Когда вы посмотрите на ваш процесс с помощью Process Explorer без отладчика, вы должны увидеть только один поток.

Этап 6: Выполнение инициализации процесса в контексте нового процесса

KiInitializeContextThread, вызываемый KeInitializeThread, создает начальный контекст потока и стек ядра потока.Новый поток начинает жизнь, запустив подпрограмму запуска потока в режиме ядра KiThreadStartup.(Более подробное описание шагов запуска потока, приводящих к этому, см. В разделе «Поток CreateThread».) Процедура KiThreadStartup выполняет следующие шаги:

  1. Понижает уровень IRQL сDPC / уровень диспетчеризации до уровня APC (асинхронный вызов процедуры).

  2. Включает расширение рабочего набора.

  3. Поставляет APC пользовательского режима в очередьновый поток для выполнения подпрограммы запуска потока пользовательского режима LdrInitializeThunk внутри Ntdll.dll.

...