为什么Windows 10在我的程序中启动额外的线程?

使用VisualStudio 2015,在一个新的空C++项目中,为控制台应用程序生成以下内容:

int main(){
返回0;
}

在返回上设置断点,并在调试器中启动程序。在Windows 7上,截至断点,此程序只有一个线程。但在Windows10上,它有五个(!)线程:主线程和四个“工作线程”等待同步对象

谁在启动线程池(或者如何发现)

Crystal ball说Debug>Windows>Threads窗口在ntdll.dll中显示这些线程!TppWorkerThread。请确保使Microsoft Symbol服务器能够自己看到这一点,请使用工具>选项>调试>符号

这也发生在VS2013中,因此它肯定不是由新的VS2015诊断功能引起的,@Adam的猜测不可能是正确的

TppWorkerThread()是线程池线程的入口点。当我在这个函数上用Debug>newbreakpoint>functionbreakpoint设置断点时。当第二个线程池线程开始执行时,我幸运地捕获了第一个线程池线程的堆栈跟踪:

[email protected]()未知
ntdll.dll!LdrpMapdLntFileName()未知
ntdll.dll!LdrpMapDllSearchPath()未知
ntdll.dll!LdrpProcessWork()未知
[email protected]()未知
ntdll.dll!TppWorkpExecuteCallback()未知
ntdll.dll!TppWorkerThread()未知
内核[email protected]@12()未知
ntdll.dll__RtlUserThreadStart()未知
&燃气轮机;[email protected]()未知

显然,加载程序正在使用Windows 10上的线程池加载DLL。这当然是新的:)在这一点上,主线程也在加载程序中执行,并发工作

因此,Windows 10利用多个内核来更快地初始化进程。这是一个功能,而不是一个bug:)

发表评论