c# - 并行代码中的多样化输出
问题描述
它以与 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 + 2 = 3
3 + 4 = 7
5 + 6 = 11
7 + 8 = 15
9 + 10 = 19
现在,如果你把它们全部加起来,你会得到一个正确的结果。如果您以随机顺序全部取走,然后选择最后一个作为您的结果……这在数学上是完全错误的。
推荐阅读
- php - 登录后如何添加目的地?
- java - 为什么这个线程代码有时会打印错误的意外结果?
- docker - 适用于 Amazon Linux 2 AMI 的 ASP.NET Core 基础映像
- maven - Mule SDK Plugin 导致 java.lang.NoClassDefFoundError: org/json/JSONObject
- regex - 在 perl 中使用双重感叹匹配 cond
- javascript - 我正在使用 nodemailer,我需要向数组中的所有用户发送电子邮件?
- kotlin - `AnAction` 返回的 `FileSystemTree` 为 `null`
- c++ - 具有多个输出的内联汇编块
- python - 我正在尝试制作康威生活游戏,但发生了一些事情
- batch-file - 调用一个变量,该变量的值是另一个变量的名称