Il est important de comprendre le fonctionnement du planificateur de pool de threads. Il a été conçu pour affiner le nombre de threads exécutant par rapport aux capacités de votre machine. Votre machine ne peut probablement exécuter que deux threads en même temps, les processeurs dual-core sont la norme actuelle. Peut-être quatre.
Ainsi, lorsque vous jetez un tas de fils sur ses genoux, il commence par activer seulement deux fils. Le reste d'entre eux sont dans une file d'attente, attendant que les cœurs du processeur deviennent disponibles. Dès que l'un de ces deux threads se termine, il en active un autre. Deux fois par seconde, il évalue ce qui se passe avec les threads actifs qui ne se terminent pas. Il fait l'hypothèse grossière que ces threads bloquent et ne progressent donc pas et permettent à un autre thread de s'activer. Vous avez maintenant trois threads en cours d'exécution. Obtenir les 500 threads, le nombre maximum de threads par défaut, prendra 249 secondes. De toute évidence, ce comportement explique ce qu'un thread doit faire pour être exécuté en tant que thread threadpool. Cela devrait se terminer rapidement et ne pas bloquer souvent. Notez que le blocage des demandes d'E/S est traité séparément.
Si ce comportement ne vous convient pas, vous pouvez utiliser un fil régulier. Il commencera à fonctionner immédiatement et à rivaliser avec les autres threads de votre programme (et du système d'exploitation) pour le temps CPU. Créer 30 000 de ces threads n'est pas possible, il n'y a pas assez de mémoire virtuelle disponible pour cela. Un système d'exploitation 32 bits efface quelque part au sud de 2000 threads, consommant toute la mémoire virtuelle disponible.Vous pouvez obtenir environ 50 000 threads sur un système d'exploitation 64 bits avant que le fichier d'échange ne soit épuisé. Tester ces limites dans un programme de production n'est pas recommandé.
Oui, j'ai découvert que ma machine a quatre cœurs. w/o threadpool mon application s'exécute 4 fois plus lentement. –