Параллельно. Для стоимости акций более одного - PullRequest
1 голос
/ 25 мая 2010

Вот проблема.

long sum = 0;
Parallel.For(1, 10000, y => { sum1 += y;} );

Решение есть ..

Parallel.For<int>(0, result.Count, () => 0, (i, loop, subtotal) =>
{
    subtotal += result[i];
    return subtotal;
},
(x) => Interlocked.Add(ref sum, x)
);

если в этом коде есть два параметра. Например

long sum1 = 0; long sum2 = 0;
Parallel.For(1, 10000, y => { sum1 += y; sum2=sum1*y; } );

что мы будем делать? Я предполагаю, что должен использовать массив!

int[] s=new int[2];
Parallel.For<int[]>(0, result.Count, () => s, (i, loop, subtotal) =>
{
    subtotal[0] += result[i];
    subtotal[1] -= result[i];
    return subtotal;
},
(x) => Interlocked.Add(ref sum1, x[0])
//but how about sum2 i tried several way but it doesn't work. 
//for example like that
//(x[0])=> Interlocked.Add (ref sum1, x[0])
//(x[1])=> Interlocked.Add (ref sum2, x[1]));

);

Ответы [ 3 ]

4 голосов
/ 25 мая 2010

Я не уверен, что смогу решить вашу проблему, потому что я действительно не знаю, что это такое. Но есть веская причина, по которой Parallel.For не так просто поддерживает такие аккумуляторы: потому что нелепо пытаться распараллелить простую операцию с побочными эффектами.

Parallel.For для распараллеливания относительно дорогих операций, которые не имеют побочных эффектов, которые зависят друг от друга. Регулярный цикл for (или Accumulate) - это то, что нужно сделать здесь.

0 голосов
/ 22 марта 2013

Просто разверните выражение так:

(x) => { Interlocked.Add(ref sum1, x[0]); Interlocked.Add(ref sum2, x[1]); }
0 голосов
/ 09 сентября 2011

См. Пример Microsoft для локальных переменных потока , для получения информации об обновлении глобалов в параллели для.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...