与Visual Studio 2015年,在一个新的空C++项目,构建控制台应用程序如下:为什么Windows 10在我的程序中启动额外的线程?
int main() {
return 0;
}
设置在返回一个破发点,并在调试器中启动该程序。在Windows 7上,从截点开始,该程序只有一个线程。但在Windows 10上,它有五个(!)线程:主线程和四个等待同步对象的“工作线程”。
谁启动线程池(或我怎么找到)?
与Visual Studio 2015年,在一个新的空C++项目,构建控制台应用程序如下:为什么Windows 10在我的程序中启动额外的线程?
int main() {
return 0;
}
设置在返回一个破发点,并在调试器中启动该程序。在Windows 7上,从截点开始,该程序只有一个线程。但在Windows 10上,它有五个(!)线程:主线程和四个等待同步对象的“工作线程”。
谁启动线程池(或我怎么找到)?
水晶球说,调试>窗口>线程窗口显示这些线程在ntdll.dll!TppWorkerThread
。请务必使Microsoft Symbol Server能够自己查看,使用工具>选项>调试>符号。
这也发生在VS2013所以它绝对不是由新VS2015诊断功能引起的,@亚当的猜测可能是不正确的。
TppWorkerThread()是用于一个线程池线程入口点。当我使用Debug> New Breakpoint> Function Breakpoint在此函数上设置断点时。我很幸运,捕捉到了这个堆栈跟踪第一线程池线程时第二线程池线程开始执行:
[email protected]() Unknown
ntdll.dll!LdrpMapDllNtFileName() Unknown
ntdll.dll!LdrpMapDllSearchPath() Unknown
ntdll.dll!LdrpProcessWork() Unknown
[email protected]() Unknown
ntdll.dll!TppWorkpExecuteCallback() Unknown
ntdll.dll!TppWorkerThread() Unknown
[email protected]@12() Unknown
ntdll.dll!__RtlUserThreadStart() Unknown
> [email protected]() Unknown
显然,装载机使用Windows 10的线程池来加载的DLL。这当然是新的:)在这一点上,主线程也在加载程序中执行,并发工作。
所以Windows 10正在多核心的优势,获得更快的初始化过程。非常多的功能,而不是bug :)
现在的问题是,Windows 10 /新Windows版本是否可以自由地使用超出进程初始化的额外线程?一些程序实际上依赖于一定数量的线程来提高性能(例如web服务器)。 –
显然答案是*是*。线程池在Web服务器上获得很多其他用途,这些不是“浪费”的线程。我在Windows 10 btw的工作站版本上测试了这个,Windows Server 2016现在仍然只在预览中。 –
我的问题是:假设我已经对我的服务器进行了配置,并且我看到5个线程带来了最高的性能。新版本的Windows可以冒昧地使用我已经创建的更多线程?我;米不要求在Web服务器上使用线程池,但在这里提出的问题,这是“我的程序中的不需要的操作系统线程” –
这里是关于Windows和无尽循环的笑话... –
也许进程得到一个线程池默认情况下在Windows 10上。 –
我会开始在'CreateThread '。请注意,使用windbg按名称放置断点是非常常见的,而在Visual Studio调试器中,这是可能的,但需要学习一些不寻常的菜单命令。 –