Quest-ce quun pool de threads?

Comment implémenterait-on un threadpool? Jai lu sur wikipedia pour « threadpool » mais je ne peux toujours « pas comprendre ce quil faut faire pour résoudre cette question (peut-être parce que je nai pas très bien compris ce quest un threadpool en termes simples).

Quelquun peut-il mexpliquer en anglais ce quest un threadpool et comment répondre à cette question?

Réponse

Un fil pool est un groupe de threads pré-instanciés et inactifs qui sont prêts à travailler. Ils sont préférables à linstanciation de nouveaux threads pour chaque tâche lorsquil y a un grand nombre de tâches courtes à effectuer plutôt quun petit nombre de longues. Cela évite davoir à subir la surcharge de création dun thread un grand nombre de fois.

La mise en œuvre variera selon lenvironnement, mais en termes simplifiés, vous avez besoin des éléments suivants:

  • Un moyen de créer des threads et de les maintenir dans un état inactif. Cela peut être accompli en demandant à chaque thread dattendre à une barrière jusquà ce que le pool le remette à fonctionner. (Cela peut être fait avec des mutex également.)
  • Un conteneur pour stocker les threads créés, comme une file dattente ou toute autre structure qui a un moyen dajouter un thread au pool et den extraire un.
  • Une interface standard ou une classe abstraite pour les threads à utiliser pour faire le travail. Il peut sagir dune classe abstraite appelée Task avec une méthode execute() qui effectue le travail puis retourne.

Lorsque le pool de threads est créé, il instanciera un certain nombre de threads pour les rendre disponibles ou en créera de nouveaux selon les besoins en fonction des besoins de limplémentation.

Lorsque le pool reçoit un Task, il prend un thread du conteneur (ou attend quun thread devienne disponible si le conteneur est vide), lui donne un Task, et rencontre la barrière. Cela provoque la reprise de lexécution du thread inactif, en invoquant la méthode execute() du Task qui lui a été donné. Une fois lexécution terminée, le thread se remet au pool pour être placé dans le conteneur pour réutilisation, puis rencontre sa barrière, se mettant en veille jusquà ce que le cycle se répète.

Commentaires

  • Un pool de threads est un groupe de threads pré-instanciés et inactifs qui sont prêts à travailler. […] Cela évite davoir à supporter la surcharge de création dun fil un grand nombre de fois. – Cela devrait être craché par Google chaque fois que quelquun recherche le fil  » pool  »
  • La création de thread pool implique-t-elle une barrière interne? Pouvez-vous partager des références, sur ces lignes?
  • @overexchange Non, ce nest pas le cas. Ma référence à cette question était un exemple dune meilleure façon de réécrire votre question barrière . (Si vous le faites, jécrirai une réponse.)
  • lune des meilleures réponses courtes.

Réponse

Le pool de threads est un ensemble de threads gérés généralement organisés dans une file dattente, qui exécutent les tâches de la file dattente des tâches.

Créer un nouvel objet thread chaque fois que vous avez besoin que quelque chose soit exécuté de manière asynchrone coûte cher. Dans un pool de threads, vous ajoutez simplement les tâches que vous souhaitez exécuter de manière asynchrone à la file dattente des tâches et le pool de threads se charge dattribuer un thread disponible, le cas échéant, pour la tâche correspondante. Dès que la tâche est terminée, le thread maintenant disponible demande une autre tâche (en supposant quil en reste).

Le pool de threads vous permet déviter de créer ou de détruire plus de threads que ce qui serait vraiment nécessaire.

Je commencerais par créer une classe avec une file de threads et une file de tâches. Ensuite, implémentez une méthode qui ajoute une tâche à la file dattente des tâches et continuez à partir de là. Évidemment, vous devez également permettre de définir le nombre maximum de threads autorisés dans un pool de threads.

Réponse

Exemple réel;

  1. Facilité: Système dexploitation
  2. Sections: Applications
  3. Personnes: Threads

Vous avez une facilité là-bas 12 personnes travaillent. Il y a 3 sections de cette installation. Cuisine, toilettes et sécurité. Si vous nutilisez pas la technique du pool de threads, cest ainsi que cela fonctionne: les 12 personnes se trouveront dans une salle de réunion, si de nouveaux clients viennent dans les locaux et demandent des tâches, vous séparerez les personnes en groupes et les enverrez faire leur travail, et de revenir à la salle de réunion. Mais, avant de commencer leur travail, il y a une phase de préparation. Ils doivent porter un uniforme correct, équiper certains appareils et marcher jusquà cette section, terminer le travail et revenir. Donc, une fois à chaque fois quils terminent leur travail (thread se termine), ils doivent retourner à la salle de réunion, se déshabiller, retirer léquipement et attendre le travail suivant. Celles-ci se réfèrent à la création dun contexte de thread, à lallocation de mémoire et au suivi des informations par OS.Le système dexploitation prend trop de temps pour réorganiser les nouveaux besoins de thread.

Si vous utilisez le pool de threads, alors, tôt le matin, vous affecterez 6 personnes à la cuisine, 2 personnes aux toilettes et 4 personnes à la sécurité. Ainsi, ils ne feront leur préparation quune fois par jour. Même sil ny a pas de clients à la cuisine, ces 4 personnes seront là, au ralenti, pour toutes les tâches à venir. Ils nont pas besoin de retourner dans la salle de réunion avant la fermeture de la cuisine (lapplication se termine). Ces 4 personnes sont dans la piscine de lapplication Cuisine et sont prêtes à servir rapidement. Mais vous ne pouvez pas promettre quils travaillent toute la journée, car la cuisine peut devenir inactive de temps en temps. La même logique sapplique également aux toilettes et à la sécurité.

Dans le premier scénario, vous ne perdez aucun thread pour aucune tâche, MAIS il faudra beaucoup de temps pour préparer chaque thread pour chaque tâche. Dans le second, vous préparez les threads à lavance, vous ne pouvez donc pas garantir que vous utiliserez tous les threads pour toutes les tâches, mais le système dexploitation fait principalement une excellente optimisation, vous pouvez donc vous y fier en toute sécurité.

Réponse

Dans une application multithread, le pool de threads est un « pool de threads disponibles » qui peut être utilisé par votre application. Habituellement, par ex. .NET, tout est géré, il vous suffit dattribuer des tâches et une fois quun thread est libre, il va lexécuter. Donc, pour implémenter un threadpool, je mattendrais à créer un concept où les tâches sont automatiquement prises par des threads gratuits sans création de thread explicite pour chaque tâche.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *