Я просто ищу новые функции .NET 4.0. При этом я пытаюсь выполнить простой расчет, используя Parallel.For
и обычный цикл for(x;x;x)
.Параллель.For(): Обновление переменной за пределами цикла
Тем не менее, я получаю разные результаты примерно в 50% случаев.
long sum = 0;
Parallel.For(1, 10000, y =>
{
sum += y;
}
);
Console.WriteLine(sum.ToString());
sum = 0;
for (int y = 1; y < 10000; y++)
{
sum += y;
}
Console.WriteLine(sum.ToString());
Я предполагаю, что потоки пытаются обновить «сумму» одновременно.
Есть ли очевидный путь вокруг него?
Параллельное программирование выполняется в двух частях: 1) выполняется в отдельном потоке и 2) синхронизирует \ передает по потокам. параллельные расширения позволяют 1), однако 2) должны быть явно адресованы разработчиком, а когда вы говорите 'sum + = y;', вы эффективно используете каждый поток, добавляя меня к сумме! все вместе. вам нужно синхронизировать их общение в отношении общего ресурса 'sum' –
мои страхи сбываются ... параллельные расширения позволяют людям писать параллельный код без понимания теории, в том числе условий гонки (как здесь) – Andrey
@ Andrey - Да, поэтому некоторые из нас на самом деле пытаются сначала изучить его (т. е. опубликовать вопросы о SO). – Inisheer