在Visual Studio 2015中,在一个新的空的C ++项目中,为控制台应用程序构build以下内容:
int main() { return 0; }
在返回中设置一个中断点,并在debugging器中启动程序。 在Windows 7上,从截点开始,这个程序只有一个线程。 但在Windows 10上,它有五个(!)线程:主线程和四个等待同步对象的“工作线程”。
谁启动线程池(或如何找出)?
水晶球说,调试> Windows>线程窗口显示ntdll.dll!TppWorkerThread
这些线程。 一定要启用Microsoft符号服务器自己看到这个,使用工具>选项>调试>符号。
这也发生在VS2013中,所以绝对不是由新的VS2015诊断功能引起的,@亚当的猜测是不正确的。
TppWorkerThread()是线程池线程的入口点。 当我用这个函数的Debug> New Breakpoint> Function Breakpoint设置一个断点时。 当第二个线程池线程开始执行时,我很幸运地捕获了第一个线程池线程的这个堆栈跟踪:
ntdll.dll!_NtOpenFile@24() Unknown ntdll.dll!LdrpMapDllNtFileName() Unknown ntdll.dll!LdrpMapDllSearchPath() Unknown ntdll.dll!LdrpProcessWork() Unknown ntdll.dll!_LdrpWorkCallback@12() Unknown ntdll.dll!TppWorkpExecuteCallback() Unknown ntdll.dll!TppWorkerThread() Unknown kernel32.dll!@BaseThreadInitThunk@12() Unknown ntdll.dll!__RtlUserThreadStart() Unknown > ntdll.dll!__RtlUserThreadStart@8() Unknown
显然,加载程序正在使用Windows 10上的线程池来加载DLL。 这当然是新的:)在这一点上,主线程也在加载程序中执行,并发工作。
因此,Windows 10正在利用多个内核来更快地初始化进程。 非常多的功能,而不是一个错误:)