一般来说,我是 C# Parallel.ForEach
、. 和 .NET 的新手。我想并行化涉及数千个位置的搜索。对于每个位置,我计算大圆距离。这是我想推广到不同核心的计算。我的问题是,如果我只有一个线程局部变量,如在这个MSDN TPL 示例中,我该怎么做?对于结果,我查看了Interlocked
,并看到了它的选项Add
、CompareExchange
、Decrement
、和Exchange
,但我不只是添加、递增、递减或测试相等性。我想通过多个并行运行的线程返回总体最短的对象Increment
Read
距离。我的直觉说这应该很容易,我应该能够创建一些包裹 aLocation
和距离的小对象,但是我如何从每个线程中捕获最佳答案,然后选择其中最短的距离?这是非并行版本:
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 博客文章,但我想知道这是否是最好的建议。我看到作者在数组上循环,想知道是否没有更实用的方法来做到这一点。在函数世界中,我会使用map
,lambda
和min
.