У нас есть непонятная ошибка в одной из наших программ. Я сузил, по крайней мере, часть его до этого параллельного цикла.
i — это int[], в целях тестирования заполненный целыми числами от 0 до 99999. runningTotal — это тип long. lockObject — это новый объект();
Кажется, что цикл Parallel-For всегда возвращает общее количество 704 982 704 после завершения; однопоточный цикл возвращает 4 999 950 000.
Так что, очевидно, проблема с потоками, но я просто не вижу ошибки. Правильно ли реализован цикл Parallel-For?
Соответствующий код ниже:
//i int[] test ---------------------------------------------
object lockObject = new object();
int[] i = new int[100000];
for (int x = 0; x < i.Length; x++)
{
i[x] = x;
}
long runningTotal = 0;
Parallel.For(0, i.Length,
() => 0,
(x, loopState, subtotal) =>
{
subtotal += i[x];
return subtotal;
},
(s) =>
{
lock (lockObject)
{
runningTotal += s;
}
}
);
runningTotal = 0;
for (int x = 0; x < i.Length; x++)
{
runningTotal += i[x];
}
localinit
возвращает 0 (Int32
), но работает надежно, еслиlocalinit
равноInt64
(Parallel.For(0, i.Length, () => 0L ...
) - person Kirill Shlenskiy   schedule 13.01.2016