Why does Windows 10 start extra threads in my program?
Crystal ball says that the Debug > Windows > Threads window shows these threads at ntdll.dll!TppWorkerThread
. Be sure to enable the Microsoft Symbol Server to see this yourself, use Tools > Options > Debugging > Symbols.
This also happens in VS2013 so it is most definitely not caused by the new VS2015 diagnostic features, @Adam's guess cannot be correct.
TppWorkerThread() is the entrypoint for a thread-pool thread. When I set a breakpoint with Debug > New Breakpoint > Function Breakpoint on this function. I got lucky to capture this stack trace for the 1st threadpool thread when the 2nd threadpool thread started executing:
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
Clearly the loader is using the threadpool on Windows 10 to load DLLs. That's certainly new :) At this point the main thread is also executing in the loader, concurrency at work.
So Windows 10 is taking advantage of multiple cores to get the process initialized faster. Very much a feature, not a bug :)
Returning from exe entry point does not terminate the process on Windows 10
I expected the process to terminate if it does not create additional
threads and returns from the main function.
process can implicit create additional threads. loader for example. and need understanding what mean
returns from the main function
here mean function which called from standard CRT mainCRTStartup
function. after this mainCRTStartup
call ExitProcess
. so not any exe entry real entry point function but some sub-function called from entry point. but entry point call ExitProcess
than.
if we not use CRT - we need call ExitProcess
yourself. if we simply return from from entry point - will be RtlExitUserThread
which not call ExitProcess
except this is last thread in process (AmILastThread
) (and here also can be race if 2 or more threads in parallel call ExitThread
)
Related Topics
Fastest Timing Resolution System
Clion C++ Can't Read/Open .Txt File in Project Directory
Why Does Makeintresource() Work
How to Get Process Handle from Process Id
Priority Queue with Limited Space: Looking for a Good Algorithm
Should "Delete This" Be Called from Within a Member Method
Stl Map Containing References Does Not Compile
Preventing Gcc from Automatically Using Avx and Fma Instructions When Compiled with -Mavx and -Mfma
What Are Practical Applications of Weak Linking
What's the Semantically Accurate Position for the Ampersand in C++ References
C++ Copy Constructor Gets Called Instead of Initializer_List<>
Converting Steady_Clock::Time_Point to Time_T
Advantages of Using Initializer List
What Standard Clause Mandates This Lvalue-To-Rvalue Conversion