Adr*_*thy 32 c++ windows multithreading threadpool
使用Visual Studio 2015,在一个新的空C++项目中,为Console应用程序构建以下内容:
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在返回时设置断点并在调试器中启动程序.在Windows 7上,从断点开始,该程序只有一个线程.但在Windows 10上,它有五个(!)线程:主线程和四个"工作线程"等待同步对象.
谁在启动线程池(或者我如何找到)?
Han*_*ant 25
Crystal ball表示Debug> Windows> Threads窗口显示了这些线程ntdll.dll!TppWorkerThread.请务必让Microsoft Symbol Server自行查看,使用工具>选项>调试>符号.
这也发生在VS2013中,所以它绝对不是由新的VS2015诊断功能造成的,@ Adam的猜测是不正确的.
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
Run Code Online (Sandbox Code Playgroud)
显然,加载器正在使用Windows 10上的线程池来加载DLL.这肯定是新的:)此时主线程也在加载器中执行,并发工作.
因此,Windows 10正在利用多个内核来更快地初始化进程.非常一个功能,而不是一个bug :)