Используя вложенную Параллель. Для

Рассмотрите этот пример:

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 каждых раз, когда я выполняю его. Почему?

6
задан Kara 4 October 2013 в 17:47
поделиться

2 ответа

Parallel Extensions поможет вам с созданием, распределением, запуском и рандеву задач в почти императивном синтаксисе. . Что он не делает , так это заботится обо всех видах безопасности потоков (одна из ловушек ). Вы пытаетесь заставить параллельные потоки одновременно обновлять одну общую переменную. Чтобы сделать что-либо подобное правильно, вы должны ввести, например, блокировка.

Я не уверен, что вы пытаетесь сделать. Я предполагаю, что ваш код - это просто заполнитель или эксперимент. Распараллеливание подходит только тогда, когда вы можете изолировать разные части работы; не тогда, когда вам постоянно приходится встречаться с общими данными.

13
ответ дан 8 December 2019 в 15:58
поделиться

В качестве альтернативы блокировке каждый раз вы можете использовать локальные переменные потока в сочетании с блокировкой:

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);
0
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: