并行编程基础——并行聚合
问题
在并行操作完成时,可以将结果聚合。聚合可以对值求和或求平均值。
解决方案
Parallel类对聚合的支持基于局部值的概念,也就是局部存在与并行循环中的变量。这意味着循环体无需同步,便可以直接访问值。当循环准备好聚合其所有局部结果时,会通过localFinally委托来处理,注意,对于持有最终结果的变量localFinally委托需要同步对它的访问。以下是并行求和的实例:
int ParallelSum(IEnumerable<int> values)
{
object mutex=new object();
int result=0;
Parallel.ForEach(source:values,localInit:()=>0,body:(item,state,localVlaue)=>localValue+item,localFinally:localValue=>{
local(mutex)
result+=localValue;
});
return result;
}
PLINQ
int ParallelSum(IEnumerable<int> values)
{
return values.AsParallel().Sum();
}
讨论
建议在使用Parallel类时,利用他提供的聚合支持。在的大多数场景中,PLINQ支持表达更为明确,且代码篇幅更短。