Здесь был бы «правильный» способ сделать это, это не потребовало бы от вас блокировки вашего конечного итогового объекта и потребовало бы только выполнения блокированных операций в конце цикла каждого локального потока.
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
Однако иметь два вложенных оператора Parallel
, выполняющих эту небольшую работу, - плохая идея. Есть накладные расходы, которые необходимо учитывать, если вы выполняете такой небольшой объем работы, было бы гораздо лучше сделать только одно заявление Parallel
или вообще не выполнять его.
Я настоятельно рекомендую вам скачать и прочитать Шаблоны для параллельного программирования , в нем подробно рассказывается, почему маленькие вложенные параллельные циклы, подобные этой, не очень хорошая идея.