并行代码中的多样化输出

它以与 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}");


白衣染霜花
浏览 178回答 1
1回答

FFIVE

好吧,如果您将临时本地结果替换为最终结果而不是将它们相加,则会得到错误的结果。函数名称说明了这一点。我不确定你为什么期望其他事情发生。1 + 2 = 33 + 4 = 75 + 6 = 117 + 8 = 159 + 10 = 19现在,如果将它们全部加起来,您会得到正确的结果。如果您以随机顺序获取所有内容,然后选择最后一个作为您的结果……这在数学上是完全错误的。
打开App,查看更多内容
随时随地看视频慕课网APP