object _ = new object();
List<int> list = new List<int>(new int {1,25,3....18,255}); //random values
int bestIndex = 0;
int bestValue = int.MinValue;
Parallel.For(0, list.Length, (i) => {
if (list[i] > bestValue)
{
lock (_)
{
bestValue = list[i];
index = i;
}
}
});
我的问题是,这有意义吗?因为我怀疑在某些情况下,即使不应该分配较低的值,它也会被分配。
您的代码不是线程安全的,因为您正在从多个线程读取和写入相同的值。您还在非常紧密的循环中使用锁,这很可能会导致开销比并行执行锁要高得多。我也建议不要将其_
用作变量名称,因为它在c#7中用于Discard。
正确的解决方案是并行运行多个独立搜索,然后对每个线程的结果进行最终比较。
var globalMin = int.MaxValue;
var lockObj = new object();
Parallel.ForEach(list,
// LocalInit, runs once for each thread
() => int.MaxValue,
// The parallel body, runs on multiple threads
(value, _, localMin) =>
{
if (value < localMin)
{
return value;
}
return localMin;
},
// Local finally, runs once for each thread,
// given the final result produced on that thread
localMin =>
{
lock (lockObj)
{
if (localMin < globalMin)
{
globalMin = localMin;
}
}
});
return globalMin;
但是,这有点长且复杂,可以选择使用linq:
list.AsParallel().Min();
编辑:我想补充一点,对于这样一个简单的任务,使用并行算法不太可能获得很多性能,至少对于原始类型而言。一次执行大量工作时,并行运行事物最有用,因此同步开销仅占整体工作的一小部分。您可以对列表进行一些手动分区,以确保每次迭代都可以做更多的工作以提高性能。但是,除非您有非常庞大的清单,否则通常不值得付出努力。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句