为了账号安全,请及时绑定邮箱和手机立即绑定

并行代码中的多样化输出

并行代码中的多样化输出

C#
白衣染霜花 2021-10-24 19:26:00
它以与 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

现在,如果将它们全部加起来,您会得到正确的结果。如果您以随机顺序获取所有内容,然后选择最后一个作为您的结果……这在数学上是完全错误的。


查看完整回答
反对 回复 2021-10-24
  • 1 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信