Форк / Соединить параллельные паттерны - PullRequest
1 голос
/ 02 декабря 2011

Всегда был немного слаб с нитями и просто проходил Параллельные вычисления Стивена Туба книга.

На стр. 39 приведены примеры шаблонов Fork / Join ниже

static T[] MyParallelInvoke<T>(params Func<T>[] functions)
{
  T[] results = new T[functions.Length];
  Parallel.For(0, functions.Length, i =>
  {
     results[i] = functions[i]();
  });
  return results;
}

// Approach #4: Using PLINQ
static T[] MyParallelInvoke<T>(params Func<T>[] functions)
{
  return functions.AsParallel().Select(f => f()).ToArray();
}

Для подхода 3, например, выше, просто чтобы уточнить, действительно ли все результаты имеют значения, когда вы делаете

"вернуть результаты"?

Или только некоторые из них будут иметь значения в зависимости от того, завершен поток или нет?

Аналогично для подхода 4, когда вы звоните ToArray()

Ответы [ 2 ]

1 голос
/ 02 декабря 2011

Да, в обоих случаях есть неявное WaitAll().

Код снаружи Parallel.For() является однопоточным.

1 голос
/ 02 декабря 2011

Parallel.For () вернет ParallelLoopResult со свойством IsCompleted.

...