Рассмотрите этот пример:
var x = 0;
for (var i = 0; i < 100; i++ )
{
for (var a = i+1; a < 100; a++)
x += 1;
}
При печати x мы всегда добираемся 4950. Что относительно того, если я хочу параллелизировать это?
Это - то, что я придумываю
Parallel.For(0, 100, i => Parallel.For(i + 1, 100, a => { x += 1; }));
Однако это Не печатает 4950 каждых раз, когда я выполняю его. Почему?
Parallel Extensions поможет вам с созданием, распределением, запуском и рандеву задач в почти императивном синтаксисе. . Что он не делает , так это заботится обо всех видах безопасности потоков (одна из ловушек ). Вы пытаетесь заставить параллельные потоки одновременно обновлять одну общую переменную. Чтобы сделать что-либо подобное правильно, вы должны ввести, например, блокировка.
Я не уверен, что вы пытаетесь сделать. Я предполагаю, что ваш код - это просто заполнитель или эксперимент. Распараллеливание подходит только тогда, когда вы можете изолировать разные части работы; не тогда, когда вам постоянно приходится встречаться с общими данными.
В качестве альтернативы блокировке каждый раз вы можете использовать локальные переменные потока в сочетании с блокировкой:
Object thisLock = new Object();
var globalSum = 0;
System.Threading.Tasks.Parallel.For(0, 100, i => {
System.Threading.Tasks.Parallel.For(i + 1, 100, () => 0, (num, loopState, subSum) => ++subSum, subSum => {
lock(thisLock) { globalSum += subSum; }
});
});
Console.WriteLine(globalSum);