Si
var arrayStrings = new string[1000];
Parallel.ForEach<string>(arrayStrings, someString =>
{
DoSomething(someString);
});
Les 1000 fils vont apparaître presque simultanément ?
Si
var arrayStrings = new string[1000];
Parallel.ForEach<string>(arrayStrings, someString =>
{
DoSomething(someString);
});
Les 1000 fils vont apparaître presque simultanément ?
Non, il ne lancera pas 1000 threads - oui, il limitera le nombre de threads utilisés. Parallel Extensions utilise un nombre approprié de cœurs, en fonction du nombre de cœurs dont vous disposez physiquement. y combien sont déjà occupés. Il alloue du travail à chaque cœur et utilise ensuite une technique appelée vol de travail pour permettre à chaque thread de traiter efficacement sa propre file d'attente et de n'avoir à effectuer des accès coûteux entre les threads que lorsque cela est vraiment nécessaire.
Jetez un coup d'œil à la Blog de l'équipe PFX para charges d'informations sur la façon dont elle répartit le travail et sur toutes sortes d'autres sujets.
Notez que dans certains cas, vous pouvez également spécifier le degré de parallélisme que vous souhaitez.
Sur une machine à un seul cœur... Parallel.ForEach partage (des morceaux) de la collection sur laquelle il travaille entre un certain nombre de threads, mais ce nombre est calculé sur la base d'un algorithme qui prend en compte et semble surveiller en permanence le travail effectué par les threads qu'il alloue au ForEach. Ainsi, si la partie corps du ForEach fait appel à des fonctions bloquantes de longue durée qui laisseraient le thread en attente, l'algorithme créera d'autres threads et répartira la collection entre eux. Si les fils se terminent rapidement et ne bloquent pas les fils d'E/S par exemple, comme le simple calcul de quelques chiffres, l'algorithme augmentera (ou même diminuera) le nombre de fils jusqu'à un point que l'algorithme considère comme optimal pour le débit (temps moyen d'achèvement de chaque itération).
En fait, le pool de threads qui se cache derrière les diverses fonctions de la bibliothèque parallèle détermine le nombre optimal de threads à utiliser. Le nombre de cœurs physiques du processeur ne constitue qu'une partie de l'équation. Il n'existe PAS de relation simple entre le nombre de cœurs et le nombre de threads générés.
Je ne trouve pas la documentation autour de l'annulation et de la remise des threads de synchronisation très utile. J'espère que MS pourra fournir de meilleurs exemples dans MSDN.
N'oubliez pas que le code du corps doit être écrit pour s'exécuter sur plusieurs threads, avec toutes les considérations habituelles de sécurité des threads, le framework n'abstrait pas ce facteur... pour l'instant.
Ver Parallel.For utilise-t-il une tâche par itération ? pour avoir une idée d'un "modèle mental" à utiliser. Toutefois, l'auteur précise que "En fin de compte, il est important de se rappeler que les détails de la mise en œuvre peuvent changer à tout moment."
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.