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)?

25
demandé sur Adrian McCarthy 2016-01-16 03:21:28

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:)

22
répondu Hans Passant 2016-01-16 13:19:11

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.

2
répondu Changming Sun 2018-08-05 06:47:10