Он печатает правильный результат 4.5 с той же вероятностью, что и 0.1, 0.2, 1, 2.3 и т. д. Что с ним не так?
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
Теперь, если вы сложите их все вы получите правильный результат. Если вы возьмете все в случайном порядке, а затем выберете последний в качестве результата ... это просто математически неверно.