【问题标题】:Fork/Join Parallel PatternsFork/Join 并行模式
【发布时间】:2011-12-01 23:12:43
【问题描述】:

在线程方面总是有点弱,只是通过Steven Toub's Parallel Computing书。

在第 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 只是为了澄清结果是否都正式具有值, 当你这样做时

“返回结果”?

或者根据线程是否已完成,它们中只有一些具有值?

当您致电ToArray() 时,方法 4 也是如此

【问题讨论】:

    标签: c# parallel-processing fork-join


    【解决方案1】:

    是的,在这两种情况下都有一个隐含的WaitAll()

    Parallel.For() 之外的代码是单线程的。

    【讨论】:

    • 你怎么知道这个隐式 WaitAll 什么时候被调用。是否像我尝试访问并行循环之外的结果数组那样我会知道 WaitAll 被调用?
    • Parallel.For(); 是一种说法。当您“执行”此语句时,其中的所有线程都已完成。
    • 看到有几种方法,您将如何确定哪种方法最好?谢谢
    • @AllenHo 该选项主要取决于具体情况,例如如何获取/存储/使用结果。线程是一样的。
    【解决方案2】:

    Parallel.For() 将返回具有 IsCompleted 属性的 ParallelLoopResult。

    【讨论】:

    • 我无法想象这何时会是“假”。也许在一个例外之后。
    • 如果调用了 Stop 或 Break ,您可能不会得到您期望的所有结果。 msdn.microsoft.com/en-us/library/dd460721.aspx
    • 对。但这并不是(不可能)表明线程仍在进行中。
    猜你喜欢
    • 1970-01-01
    • 2015-12-18
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 2012-09-07
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多