Pourquoi Windows 10 démarre-t-il des threads supplémentaires dans mon programme?
Avec Visual Studio 2015, dans un nouveau projet c++ vide, créez ce qui suit pour L'application Console:
int main() {
return 0;
}
Définissez un point d'arrêt sur le retour et lancez le programme dans le débogueur. Sous Windows 7, à partir du point de rupture, ce programme n'a qu'un seul thread. Mais sur Windows 10, il a cinq (!) threads: le thread principal et quatre "threads de travail" en attente sur un objet de synchronisation.
Qui démarre le pool de threads (ou comment puis-je le savoir)?
2 réponses
Crystal ball indique que la fenêtre Debug > Windows > Threads affiche ces threads à ntdll.dll!TppWorkerThread
. Assurez-vous d'activer le Microsoft Symbol Server pour le voir vous-même, utilisez Outils > Options > Débogage > symboles.
Cela se produit également dans VS2013, donc il n'est certainement pas causé par les nouvelles fonctionnalités de diagnostic VS2015, la supposition de @Adam ne peut pas être correcte.
TppWorkerThread () est le point d'entrée d'un thread de pool de threads. Lorsque je définis un point D'arrêt avec Debug > nouveau point D'Arrêt > Fonction Point d'arrêt sur cette fonction. J'ai eu la chance de capturer cette trace de pile pour le thread 1st threadpool lorsque le thread 2nd threadpool a commencé à s'exécuter:
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
Il est clair que le chargeur utilise le threadpool sur Windows 10 pour charger des dll. C'est certainement nouveau :) à ce stade, le thread principal s'exécute également dans le chargeur, la concurrence au travail.
Donc, Windows 10 profite de plusieurs cœurs pour initialiser le processus plus rapidement. Très bien une fonctionnalité, pas un bug:)
C'est le pool de threads par défaut. https://docs.microsoft.com/en-us/windows/desktop/procthread/thread-pools
Chaque processus a un pool de threads par défaut.