并行代码的不同输出
Diverse output in parallel code
它以与 0.1、0.2、1、2.3 等相同的概率打印正确结果 4.5。它有什么问题?
double average = 0;
Parallel.ForEach(
Enumerable.Range(0, 10),
() => 0,
(elem, loopState, localSum) => {
localSum += elem;
return localSum;
},
localSum => {
double localAvg = localSum / 10.0;
Interlocked.Exchange(ref average, localAvg);
}
);
Console.WriteLine($"Average in parallel manner: {average}");
例如:
Average in parallel manner: 0,2
Average in parallel manner: 3,2
Average in parallel manner: 1,2
但是当我将类似的代码与 Interlocked.Add()
:
一起使用时一切正常
int totalSum = 0;
Parallel.For(0, 10, () => 0, (ind, loopState, local) => {
local += ind;
return local;
},
local => Interlocked.Add(ref totalSum, local));
Console.WriteLine($"Total sum in parallel manner: {totalSum}");
好吧,如果您交换临时本地结果而不是将它们相加,您会得到错误的结果。函数名称说明了很多。我不确定您为什么期望发生其他事情。
1 + 2 = 3
3 + 4 = 7
5 + 6 = 11
7 + 8 = 15
9 + 10 = 19
现在,如果您将它们全部加起来,您将得到正确的结果。如果你以随机顺序全部拿走,然后选择最后一个作为你的结果......这在数学上是完全错误的。
它以与 0.1、0.2、1、2.3 等相同的概率打印正确结果 4.5。它有什么问题?
double average = 0;
Parallel.ForEach(
Enumerable.Range(0, 10),
() => 0,
(elem, loopState, localSum) => {
localSum += elem;
return localSum;
},
localSum => {
double localAvg = localSum / 10.0;
Interlocked.Exchange(ref average, localAvg);
}
);
Console.WriteLine($"Average in parallel manner: {average}");
例如:
Average in parallel manner: 0,2
Average in parallel manner: 3,2
Average in parallel manner: 1,2
但是当我将类似的代码与 Interlocked.Add()
:
int totalSum = 0;
Parallel.For(0, 10, () => 0, (ind, loopState, local) => {
local += ind;
return local;
},
local => Interlocked.Add(ref totalSum, local));
Console.WriteLine($"Total sum in parallel manner: {totalSum}");
好吧,如果您交换临时本地结果而不是将它们相加,您会得到错误的结果。函数名称说明了很多。我不确定您为什么期望发生其他事情。
1 + 2 = 3
3 + 4 = 7
5 + 6 = 11
7 + 8 = 15
9 + 10 = 19
现在,如果您将它们全部加起来,您将得到正确的结果。如果你以随机顺序全部拿走,然后选择最后一个作为你的结果......这在数学上是完全错误的。