它以与 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}");例如:平均并行方式:0,2平均并行方式:3,2平均并行方式: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 回答
FFIVE
TA贡献1797条经验 获得超6个赞
好吧,如果您将临时本地结果替换为最终结果而不是将它们相加,则会得到错误的结果。函数名称说明了这一点。我不确定你为什么期望其他事情发生。
1 + 2 = 3
3 + 4 = 7
5 + 6 = 11
7 + 8 = 15
9 + 10 = 19
现在,如果将它们全部加起来,您会得到正确的结果。如果您以随机顺序获取所有内容,然后选择最后一个作为您的结果……这在数学上是完全错误的。
- 1 回答
- 0 关注
- 177 浏览
添加回答
举报
0/150
提交
取消