2016-01-16 23 views
17

與Visual Studio 2015年,在一個新的空C++項目,構建控制檯應用程序如下:爲什麼Windows 10在我的程序中啓動額外的線程?

int main() { 
    return 0; 
} 

設置在返回一個破發點,並在調試器中啓動該程序。在Windows 7上,從截點開始,該程序只有一個線程。但在Windows 10上,它有五個(!)線程:主線程和四個等待同步對象的「工作線程」。

誰啓動線程池(或我怎麼找到)?

+0

這裏是關於Windows和無盡循環的笑話... –

+0

也許進程得到一個線程池默認情況下在Windows 10上。 –

+1

我會開始在'CreateThread '。請注意,使用windbg按名稱放置斷點是非常常見的,而在Visual Studio調試器中,這是可能的,但需要學習一些不尋常的菜單命令。 –

回答

17

水晶球說,調試>窗口>線程窗口顯示這些線程在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 :)

+0

現在的問題是,Windows 10 /新Windows版本是否可以自由地使用超出進程初始化的額外線程?一些程序實際上依賴於一定數量的線程來提高性能(例如web服務器)。 –

+1

顯然答案是*是*。線程池在Web服務器上獲得很多其他用途,這些不是「浪費」的線程。我在Windows 10 btw的工作站版本上測試了這個,Windows Server 2016現在仍然只在預覽中。 –

+2

我的問題是:假設我已經對我的服務器進行了配置,並且我看到5個線程帶來了最高的性能。新版本的Windows可以冒昧地使用我已經創建的更多線程?我;米不要求在Web服務器上使用線程池,但在這裏提出的問題,這是「我的程序中的不需要的操作系統線程」 –

相關問題