2011-02-13 74 views
0

我运行一个简单的Windows控制台应用程序: - 当控制正值主我甩了stack--为什么在进程启动期间创建了额外的工作线程?

_ 我的主线程的堆栈:

5840 0 Main Thread Main Thread Normal 


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

console.exe!__tmainCRTStartup() 

console.exe!wmainCRTStartup() 

[email protected]@12() 

[email protected]() 

[email protected]() 

__

的为什么我在启动时看到这一点很好?:

3740 0 Worker Thread Win32 Thread Normal 

堆栈:

[email protected]() 
[email protected]() 
[email protected]() 
[email protected]() 
+0

运行时库的一部分或Windows将创建另一个线程。为什么这会打扰你? – 2011-02-13 13:36:59

回答

1

LdrInitializeThunk是方法设置一个新的线程。我确实使用VS2008创建了一个普通的Win32控制台应用程序(没有MFC,ATL)并且只有一个线程。只有当我连接一个调试器时,我会得到第二个调试器,因为调试器注入一个线程来启用调试过程。 流程启动在here一书中有详细介绍,其中没有提到第二个线程是需要的。异步程序调用APCs也不是怪罪。也许你的调用堆栈是在没有加载所有符号的情况下创建的,并且你错误地怀疑调试器助手线程是你的应用程序中的隐藏线程。当你用没有调试器的进程资源管理器来查看你的进程时,你应该只能看到一个线程。

阶段6:执行流程 初始化在 新工艺

KiInitializeContextThread,这是 由KeInitializeThread叫的上下文建立 线程和 线程的内核堆栈的初始上下文。新的 线程开始运行 内核模式线程启动例程 KiThreadStartup。 (有关线程启动 步骤导致这种的更详细的 描述,请参见 “的CreateThread的流动”。)的 KiThreadStartup例程执行 以下步骤:

  1. 从降低IRQL水平DPC /调度级别到APC (异步过程调用)级别。

  2. 启用工作集扩展。

  3. 将用户模式APC排队到新线程以执行用户模式 线程启动例程 Ntdll.dll中的LdrInitializeThunk。

相关问题