2010-12-03 3 views
3

Je viens d'implémenter une toute première jobqueue multithread simple en C++ et j'ai pensé (et lu) que c'est une bonne idée d'utiliser un thread de travail pour chaque thread matériel (dans mon cas ce serait 4). Fondamentalement, mon application charge juste beaucoup d'images (en même temps) de l'Internet en ce moment, et je remarque que je reçois une énorme accélération si j'augmente le nombre de threads de travail à 8 ou même 16 au lieu de 4.C++ Jobqueue: Y a-t-il une règle générale pour le nombre de threads de travail?

Existe-t-il une règle générale sur le nombre de threads à utiliser dans une telle file d'attente? Je devinerais que 4 serait un nombre plus grand si je créais de nouveaux emplois chaque cadre, et les threads de travail avaient une charge de travail constante à chaque image, tandis que si je veux traiter beaucoup de choses à la fois (comme le chargement de 50 images) plus de threads que cela peut donner une grande accélération. Pourtant, y a-t-il une règle empirique pour le bon numéro dans différents scénarios?

Merci

Répondre

2

Le nombre idéal de threads de travail est égal au nombre de cœurs de processeur dans le système. Cependant, en réalité, cela est sous-optimal car parfois les tâches peuvent bloquer sur le réseau, les E/S disque, etc. entraînant une sous-utilisation. Cela ressemble à ce qui se passe ici.

Souvent, les pools d'unités d'exécution vont "sur-planifier" pour compenser cela. Parfois, le support du noyau est intégré pour vous avertir quand les threads se bloquent, donc vous savez en créer un autre (les ports d'achèvement dans Win32) et quand même atteindre le nombre optimal de threads de travail actifs.

0

quelque temps il y a je cherchais la réponse à cette question et je suis tombé sur un article qui msdn a déclaré qu'il est préférable d'utiliser du fil max 16 par cœur. Malheureusement, je ne trouve plus l'article, mais pour le chargement des images, 16 threads par cœur ont du sens.

2

Microsoft a choisi de fournir une implémentation de pool de threads (disponible à partir du système d'exploitation, et également disponible dans .net) avec le nombre de threads démarrant à 1,5 fois le nombre de processeurs. L'idée est qu'un thread qui bloque (pour le disque i/o, etc.) peut échanger un autre thread qui n'est pas bloqué. Le pool de threads est également configurable de sorte que vous pouvez demander un nombre minimum de threads, si vous décidez d'avoir 2x, 3x, ou plus de threads. Je soupçonne que tout cela s'applique à votre situation.

+0

J'ai oublié de dire que je suis sur OSX (en utilisant boost :: thread), j'aime coder les choses moi-même à cet égard en raison de la portabilité. – moka

Questions connexes