首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在进程启动期间创建额外的工作线程?

为什么在进程启动期间创建额外的工作线程?
EN

Stack Overflow用户
提问于 2011-02-13 13:31:27
回答 1查看 1.3K关注 0票数 0

我正在运行一个简单的windows控制台应用程序:-当控件到达主站时,我转储了堆栈--

-我的主线程堆栈:

代码语言:javascript
运行
复制
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()  

__

上面的很好,为什么我在启动时看到这个??:

代码语言:javascript
运行
复制
3740    0   Worker Thread   Win32 Thread Normal

堆叠:

代码语言:javascript
运行
复制
ntdll.dll!_KiFastSystemCallRet@0()  
ntdll.dll!_ZwDelayExecution@8()
ntdll.dll!__LdrpInitialize@8()
ntdll.dll!_LdrInitializeThunk@8()
EN

回答 1

Stack Overflow用户

发布于 2011-02-13 14:24:38

LdrInitializeThunk是设置新线程的方法。我确实用VS2008创建了一个普通的Win32控制台应用程序(没有MFC,ATL),并且只得到一个线程。只有当我附加调试器时,我才会得到第二个调试器,因为调试器注入一个线程来启用进程的调试。这里一书中详细介绍了进程启动,其中没有提到需要第二个线程。异步过程调用装甲运兵车也是不可怪的。也许您的调用堆栈是使用并非所有加载的符号创建的,并且错误地怀疑调试器助手线程是应用程序中的一个隐藏线程。当您使用没有调试器的查看您的进程时,您应该只看到一个线程。

第6阶段:在新流程的上下文中执行进程初始化 KiInitializeContextThread由KeInitializeThread调用,它构建线程和线程的内核堆栈的初始上下文。新线程开始运行内核模式线程启动例程KiThreadStartup。(有关导致这种情况的线程启动步骤的更详细说明,请参见“CreateThread流”一节。)KiThreadStartup例程执行以下步骤:

  1. 将IRQL级别从DPC/调度级别降低到APC (异步过程调用)级别。
  2. 启用工作集扩展。
  3. 将用户模式APC排队到新线程,以在Ntdll.dll中执行用户模式线程启动例程Ntdll.dll。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4984401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档