【发布时间】:2010-07-23 22:17:02
【问题描述】:
我是 C#、Parallel.ForEach 和 .NET 的新手。我想并行化涉及数千个位置的搜索。对于每个位置,我计算大圆距离。这是我想推广到不同核心的计算。我的问题是,如果我只有 一个 线程局部变量,如MSDN TPL example,我该怎么做?对于结果,我查看了Interlocked,并看到了它的选项Add、CompareExchange、Decrement、Exchange、Increment 和Read,但我不只是添加、递增、递减,或测试是否相等。我想通过多个并行运行的线程返回具有最短 总体 距离的对象。我的直觉说这应该很容易,我应该能够创建一些包含Location 和距离的小对象,但是我如何从每个线程中捕获最佳答案并然后选择他们之间的距离最短?这是非并行版本:
Location findClosestLocation(Location myLocation, List<Location> allLocations)
{
double closest = double.MaxValue;
Location closestLoc = null;
foreach (Location aLoc in allLocations)
{
if (aLoc != myLocation)
{
double d = greatCircle(myLocation, aLoc);
if (d < closest)
{
closest = d;
closestLoc = aLoc;
}
}
}
return closestLoc;
}
我确实看到DDJ Blog Post 似乎提供了很好的建议,但我想知道这是否是最好的建议。我看到作者在数组上循环,想知道是否没有更实用的方法来做到这一点。在函数世界中,我会使用map、lambda 和min。
【问题讨论】:
标签: c# .net c#-4.0 parallel-processing parallel-extensions