39 votes

Quand ne devrais-je pas utiliser le ThreadPool dans .Net?

Quand ne devrais-je pas utiliser le ThreadPool dans .Net?

Il semble que la meilleure option consiste à utiliser un ThreadPool, auquel cas, pourquoi n’est-ce pas la seule option?

Quelles sont vos expériences autour de cela?

29voto

Derek Park Points 25025

@Eric, je vais être d'accord avec le Doyen. Les Threads sont chers. Vous ne pouvez pas supposer que votre programme est le seul cours d'exécution. Quand tout le monde est gourmand en ressources, le problème se multiplie.

Je préfère créer mon fils manuellement et le contrôle de moi-même. Il garde le code très facile à comprendre.

C'est bien quand c'est approprié. Si vous avez besoin d'un tas de threads de travail, même si, tout ce que vous avez fait est de rendre votre code plus compliqué. Maintenant, vous devez écrire du code pour gérer. Si vous venez d'utiliser un pool de threads, vous obtiendrez tous les thread de gestion pour gratuit. Et le pool de threads fournis par la langue est très susceptible d'être plus robuste, plus efficace, et moins buggé que tout ce que vous roulez pour vous-même.

Thread t = new Thread(new ThreadStart(DoSomething));  
t.Start();  
t.Join();  

J'espère que vous auriez normalement un code supplémentaire dans l'entre - Start() et Join(). Sinon, le thread supplémentaire est inutile, et vous êtes gaspiller des ressources pour aucune raison.

Les gens sont bien trop peur des ressources utilisées par les threads. Je n'ai jamais vu la création et le démarrage d'un thread pour prendre plus d'une milliseconde. Il n'y a aucune limite sur le nombre de threads que vous pouvez créer. L'utilisation de la RAM est minime. Une fois que vous avez quelques centaines de threads CPU devient un problème en raison de changements de contexte, donc, à ce stade, vous pourriez voulez obtenir la fantaisie avec votre conception.

Une milliseconde est un long temps sur le matériel moderne. C'est 3 millions de cycles sur un 3GHz machine. Et encore, vous n'êtes pas le seul à créer de threads. Votre fils en compétition pour le CPU avec tous les autres programmes, les threads. Si vous utilisez pas-vraiment-trop-nombreux fils, et un autre programme, puis vous avez utilisé trop de threads.

Sérieusement, ne pas rendre la vie plus complexe qu'elle en a besoin. Ne pas utiliser le pool de threads, sauf si vous avez besoin de quelque chose de très spécifique qu'il propose.

En effet. Ne pas rendre la vie plus complexe. Si votre programme a besoin de plusieurs threads de travail, ne pas réinventer la roue. Utiliser le pool de threads. C'est pourquoi elle est là. Voulez-vous rouler votre propre chaîne de classe?

17voto

Will Points 76760

La seule raison pour laquelle je ne pas utiliser l' ThreadPool pour les bas prix le multithreading est si j'ai besoin de...

  1. interract avec la méthode en cours d'exécution (par exemple, pour le tuer)
  2. exécuter du code sur un thread STA (cela m'est arrivé)
  3. garder le fil vivant après ma demande est mort (ThreadPool threads threads d'arrière-plan)
  4. dans le cas où j'ai besoin de changer la priorité du Thread. Nous ne pouvons pas changer la priorité des threads dans le pool de threads qui est par défaut à la Normale.

P. S.: L'article MSDN "La gestion de Pool de Threads" contient une section intitulée, "Quand ne Pas Utiliser le Pool de Threads", avec une très similaires mais légèrement plus complète de la liste de raisons possibles pour ne pas utiliser le pool de threads.

Il ya beaucoup de raisons pourquoi vous avez besoin de sauter l' ThreadPool, mais si vous ne les connaissez pas alors l' ThreadPool devrait être assez bon pour vous.

Sinon, regardez les nouvelles Extensions Parallèles Cadre, qui a bien des choses qui peuvent répondre à vos besoins sans avoir à utiliser l' ThreadPool.

9voto

Derek Park Points 25025

Les pools de threads sens chaque fois que vous avez la notion de threads de travail. De tout temps, vous pouvez facilement le traitement de partition dans les petites tâches, qui peuvent être traitées indépendamment les threads de travail (et donc d'un pool de threads) du sens.

Les pools de threads n'ont pas de sens lorsque vous avez besoin de thread qui effectuent entièrement dissemblables et sans rapport avec les actions, qui ne peuvent pas être considérés comme des "emplois"; par exemple, Un thread de l'interface de gestion des événements, l'autre pour le traitement principal. Les pools de threads n'a pas de bon sens lors du traitement de formes d'un pipeline.

En gros, si vous avez des threads qui, au départ, le processus de travail et d'arrêter de fumer, d'un pool de threads est probablement la voie à suivre. Sinon, le pool de threads n'est pas vraiment aider.

8voto

Dogmang Points 612

Pour querelleur réponse, je voudrais ajouter qu'il est préférable de ne pas utiliser un pool de threads thread si vous avez besoin pour garantir que votre fils va commencer à travailler immédiatement. Le nombre maximum de thread en cours d'exécution de pool de threads est limitée par domaine d'application, de sorte que votre pièce de travail peut avoir à attendre si ils sont tous occupés. Il est appelé "file d'attente de l'utilisateur de l'élément de travail", après tout.

Deux mises en garde, bien sûr:

  1. Vous pouvez modifier le nombre maximal de threads de pool de threads dans le code, au moment de l'exécution, donc il n'y a rien pour vous empêcher de vous la vérification de l'actuel vs nombre maximum et monter au maximum si nécessaire.
  2. Filature du un nouveau fil est livré avec son propre temps de pénalité s'il est intéressant pour vous de prendre le succès dépend de votre situation.

2voto

Will Dean Points 25866

Je ne parle pas que de quelqu'un qui n' la connaissance théorique ici. J'écris et de maintenir les applications à volume élevé qui font un usage intensif du multithreading, et en général je n'ai pas trouver le fil piscine à la bonne réponse.

Ah, l'argument d'autorité - mais toujours à la recherche de personnes qui pourraient être sur le noyau de Windows de l'équipe.

Aucun de nous disputions avec le fait que si vous avez certaines exigences spécifiques de la .NET ThreadPool pourrait ne pas être la bonne chose. Ce que nous sommes s'opposer à la banalisation des coûts à la machine de création d'un thread.

La dépense considérable de création d'un thread à la raison d'etre du pool de threads en premier lieu. Je ne veux pas que mes machines à remplir avec le code écrit par des gens qui ont été mal informés sur les frais de création d'un thread, et ne pas, par exemple, de savoir qu'il provoque une méthode pour être appelé dans tous les DLL qui est attaché au processus (qui sera créé par le 3e parties), et qui pourrait bien chaud jusqu'à une charge de code qui n'a pas besoin d'être dans la mémoire RAM à tous et presque certainement n'a pas besoin d'être en L1.

La forme de la hiérarchie de mémoire dans une machine moderne signifie que 'distraire' un PROCESSEUR est la pire chose que vous pouvez éventuellement faire, et tout le monde qui se soucie de leur métier doivent travailler dur pour l'éviter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X