serait ici la « bonne » façon de le faire, ce ne serait pas vous obliger à verrouillez votre objet total final et vous demanderez seulement de faire les opérations interverrouillées à la fin de la boucle de chaque thread local.
int x = 0;
Parallel.For(0, 100,
() => 0, //LocalInit
(i, loopstate, outerlocal) =>
{
Parallel.For(i + 1, 100,
() => 0, //LocalInit
(a, loopState, innerLocal) => { return innerLocal + 1; },
(innerLocal) => Interlocked.Add(ref outerlocal, innerLocal)); //Local Final
return outerlocal;
},
(outerLocal) => Interlocked.Add(ref x, outerLocal)); //Local Final
Cependant, ayant deux déclarations Parallel
imbriquées qui font ce petit travail est probablement une mauvaise idée. Il y a des frais généraux qui doivent être pris en compte, si vous faites une si petite quantité de travail il serait préférable de faire une seule déclaration Parallel
ou n'en avoir aucune.
Je vous recommande fortement d'aller télécharger et lire Patterns for Parallel Programming, il va dans le bon détail sur pourquoi de petites boucles parallèles imbriquées comme ceci ne sont pas une bonne idée.
peut-être vous devriez verrouiller x – onof
@onof, comment feriez-vous cela? –
Parallèle.Pour (0, 100, i => Parallèle.Pour (i + 1, 100, a => {verrou (x) {x + = 1;}})); – onof