web-dev-qa-db-fra.com

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 les éléments suivants 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. Sur Windows 7, à partir du point d'arrêt, 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 le savoir)?

35
Adrian McCarthy

Crystal ball indique que la fenêtre Débogage> Windows> Threads affiche ces threads à ntdll.dll!TppWorkerThread. Assurez-vous d'activer 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 pour un thread de pool de threads. Lorsque j'ai défini un point d'arrêt avec Debug> New Breakpoint> Function Breakpoint sur cette fonction. J'ai eu la chance de capturer cette trace de pile pour le 1er thread threadpool lorsque le 2ème thread 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

De toute évidence, le chargeur utilise le pool de threads sur Windows 10 pour charger les DLL. C'est certainement nouveau :) À ce stade, le thread principal s'exécute également dans le chargeur, la concurrence au travail.

Windows 10 profite donc de plusieurs cœurs pour initialiser le processus plus rapidement. C'est vraiment une fonctionnalité, pas un bug :)

27
Hans Passant

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.

3
Changming Sun