这将是执行此操作的“正确”方式,这不需要您锁定最终的总对象,并且只需要您在每个本地线程循环结束时执行互锁操作。
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
语句或根本不做。
我强烈建议您下载并阅读Patterns for Parallel Programming,它详细说明了为什么像这样的小型嵌套并行循环不是一个好主意。