Я грубо-принудительное суммирование всех простых чисел до 2000000. После этого, просто для удовольствия я пытался параллельно, но я был немного удивлен, когда увидел, что Parallel.For
дает мне неверно сумма!.Net Parallel.For странное поведение
Вот мой код: (C#)
static class Problem
{
public static long Solution()
{
long sum = 0;
//Correct result is 142913828922
//Parallel.For(2, 2000000, i =>
// {
// if (IsPrime(i)) sum += i;
// });
for (int i = 2; i < 2000000; i++)
{
if (IsPrime(i)) sum += i;
}
return sum;
}
private static bool IsPrime(int value)
{
for (int i = 2; i <= (int)Math.Sqrt(value); i++)
{
if (value % i == 0) return false;
}
return true;
}
}
Я знаю, что перебор очень плохое решения здесь, но это не вопрос о том. Думаю, я совершил очень тупую ошибку, но я просто не могу ее найти. Итак, for
вычисляется правильно, но Parallel.For
нет.
Возможный дубликат [Parallel.For(): обновить переменную за пределами цикла] (http://stackoverflow.com/questions/2774170/parallel-for-update-variable-outside-of-loop) –
И точный дубликат [Различные результаты суммирования с Parallel.ForEach] (http://stackoverflow.com/questions/3367293/different-summation-results-with-parallel-foreach/3367311#3367311) –