Quelle est la différence entre l'utilisation d'un nouveau thread et l'utilisation d'un thread du pool de threads? Quels sont les avantages en termes de performances et pourquoi devrais-je envisager d'utiliser un thread du pool plutôt que celui que j'ai créé explicitement? Je pense spécifiquement à .NET ici, mais les exemples généraux sont bien.
la source
Le pool de threads géré .NET: -
Il existe d'autres implémentations de pool de threads qui pourraient être plus appropriées pour les opérations de longue durée.
Plus précisément, utilisez un pool de threads pour empêcher votre application de créer trop de threads. La fonction la plus importante d'un pool de threads est la file d'attente de travail. Autrement dit, une fois que votre machine est suffisamment occupée, le pool de threads mettra en file d'attente les requêtes plutôt que de générer immédiatement plus de threads.
Donc, si vous créez un petit nombre limité de threads, créez-les vous-même. Si vous ne pouvez pas déterminer à l'avance le nombre de threads qui peuvent être créés (par exemple, ils sont créés en réponse aux E / S entrantes) et que leur travail sera de courte durée, utilisez le pool de threads. Si vous ne savez pas combien, mais que leur travail sera de longue durée, il n'y a rien dans la plate-forme pour vous aider - mais vous pourrez peut-être trouver d'autres implémentations de threadpool qui conviennent.
la source
aussi
génère un thread de premier plan qui ne mourra pas si vous fermez votre programme. Les threads ThreadPool sont des threads d'arrière-plan qui meurent lorsque vous fermez l'application.
la source
J'étais curieux de l'utilisation relative des ressources pour ceux-ci et j'ai exécuté un benchmark sur mon ordinateur portable Intel i5 bicœur 2012 en utilisant la version .net 4.0 construite sur Windows 8. Les pools de threads prenaient en moyenne 0,035 ms pour démarrer là où les threads prenaient en moyenne 5,06 SP. En d'autres termes, le thread dans le pool a démarré environ 300 fois plus vite pour un grand nombre de threads de courte durée. Au moins dans la plage testée (100-2000) threads, le temps total par thread semblait assez constant.
C'est le code qui a été comparé:
la source
Vérifiez ici pour un fil précédent:
Quand ne dois-je pas utiliser le ThreadPool dans .Net?
Le résumé est que Threadpool est bon si vous avez besoin de générer de nombreux threads de courte durée, alors que l'utilisation de Threads vous donne un peu plus de contrôle.
la source
Le stockage local de threads n'est pas une bonne idée avec les pools de threads. Cela donne aux fils une "identité"; tous les threads ne sont plus égaux. Maintenant, les pools de threads sont particulièrement utiles si vous avez juste besoin d'un tas de threads identiques, prêts à faire votre travail sans surcharge de création.
la source
Si vous avez besoin de beaucoup de threads, vous souhaiterez probablement utiliser un ThreadPool. Ils réutilisent les threads, ce qui vous évite la surcharge de création de threads.
Si vous n'avez besoin que d'un thread pour faire quelque chose, Thread est probablement le plus simple.
la source
Le besoin principal des threads de pool est de gérer de petites tâches courtes qui devraient se terminer presque instantanément. Les gestionnaires d'interruptions matérielles s'exécutent souvent dans un contexte d'empilement qui ne conviendrait pas au code non-noyau, mais un gestionnaire d'interruptions matérielles peut découvrir qu'un rappel d'achèvement d'E / S en mode utilisateur doit être exécuté dès que possible. Créer un nouveau thread dans le but d'exécuter une telle chose serait excessif. Il est beaucoup plus efficace d'avoir quelques threads pré-créés qui peuvent être envoyés pour exécuter des rappels d'achèvement d'E / S ou d'autres choses similaires.
Un aspect clé de ces threads est que si les méthodes d'achèvement d'E / S se terminent toujours essentiellement instantanément et ne bloquent jamais, et que le nombre de ces threads qui exécutent actuellement de telles méthodes est au moins égal au nombre de processeurs, le seul moyen pour tout autre thread pourrait s'exécuter avant la fin de l'une des méthodes susmentionnées si l'une des autres méthodes se bloque ou si son temps d'exécution dépasse une tranche de temps de threading normale; aucun de ces problèmes ne devrait se produire très souvent si le pool de threads est utilisé comme prévu.
Si l'on ne peut pas s'attendre à ce qu'une méthode se termine dans les 100 ms environ après le début de l'exécution, la méthode doit être exécutée via un autre moyen que le pool de threads principal. Si l'on a beaucoup de tâches à effectuer qui sont gourmandes en CPU mais qui ne bloquent pas, il peut être utile de les répartir en utilisant un pool de threads d'application (un par cœur de CPU) qui est séparé du threadpool "principal", depuis l'utilisation plus de threads que de cœurs seront contre-productifs lors de l'exécution de tâches non bloquantes gourmandes en ressources processeur. Si, cependant, une méthode prend une seconde ou plus à s'exécuter et passe la plupart de son temps bloquée, la méthode devrait probablement être exécutée dans un thread dédié et ne devrait presque certainement pas être exécutée dans un thread du pool de threads principal. Si une opération de longue durée doit être déclenchée par quelque chose comme un rappel d'E / S,
la source
En général (je n'ai jamais utilisé .NET), un pool de threads serait utilisé à des fins de gestion des ressources. Il permet de configurer des contraintes dans votre logiciel. Cela peut également être fait pour des raisons de performances, car la création de nouveaux threads peut être coûteuse.
Il peut également y avoir des raisons spécifiques au système. En Java (encore une fois, je ne sais pas si cela s'applique à .NET), le gestionnaire des threads peut appliquer des variables spécifiques aux threads lorsque chaque thread est extrait du pool, et les annuler lorsqu'ils sont retournés (moyen courant de transmettre quelque chose comme une identité).
Exemple de contrainte: je n'ai que 10 connexions db, donc je n'autoriserais que 10 threads de travail pour accéder à la base de données.
Cela ne signifie pas que vous ne devez pas créer vos propres threads, mais il y a des conditions dans lesquelles il est logique d'utiliser un pool.
la source
L'utilisation d'un pool est une bonne idée, si vous ne savez pas ou ne pouvez pas contrôler le nombre de threads qui seront créés.
J'ai juste un problème avec un formulaire utilisant un thread pour mettre à jour un champ d'une base de données sur un événement de changement de position d'un contrôle de liste (éviter le gel). Il a fallu 5 minutes à mon utilisateur pour avoir une erreur de la base de données (trop de connexions avec Access) car il changeait trop rapidement la position de la liste ...
Je sais qu'il existe un autre moyen de résoudre le problème de base (y compris ne pas utiliser l'accès), mais la mise en commun est un bon début.
la source
Fil :
Thread-Pool :
la source