【问题标题】:parallel programming in TPLTPL 中的并行编程
【发布时间】:2014-08-02 13:56:02
【问题描述】:

我在 .net 4.0 中使用任务并行库 我希望能够为独立于其他核心的每个核心指定一个任务。通常在 TPL 中,我创建一个任务并告诉它并行运行,我无法控制创建的线程数量,也无法控制参与并行任务的核心数量。另外,我不能为每个特定的核心指定不同的任务。 如果可能的话,我想知道如何在 TPL 中实现这一点。

【问题讨论】:

  • 所以你想......使用 TPL 来基本模拟使用普通线程?

标签: c# vb.net parallel-processing


【解决方案1】:

正如其他人指出的那样,您可能不想这样做。

CodePlex 上有一个 ParallelExtensionsExtras 库,其中包含 various task schedulers,其中一个是“每个任务线程”调度程序,另一个 (LimitedConcurrencyLevelTaskScheduler) 允许您指定并行度。

但是,它们不提供与特定内核的线程关联性。您必须自己编写代码。

【讨论】:

    【解决方案2】:

    TPL 动态调整并发程度,以最有效地使用所有可用的处理器。如果这是个问题,TPL 可能不适合您。

    我知道的最接近的是ParallelEnumerable.WithDegreesOfParallelism,它设置了用于处理查询的并发执行任务的最大数量。

    但是,这听起来不符合您的要求,因此您可能需要细粒度的控制,在这种情况下,我建议直接使用线程。

    【讨论】:

    【解决方案3】:

    我无法控制创建的线程数量,也无法控制参与并行任务的核心数量。

    按照设计,TPL 的目的是您不必必须处理这些问题。调整可能非常复杂,TPL 做得很好。

    【讨论】:

      【解决方案4】:

      我刚刚注意到有一种方法可以控制 TPL 中的并行度。示例代码如下,它使用 ParallelOptions 来决定并行执行循环的最大并发数。

      本文摘自 Richard Carr 的一篇文章:Control Degree of Parallelism in TPL

      ParallelOptions po = new ParallelOptions();
      po.MaxDegreeOfParallelism = 2;
      
      Parallel.For(0, 20, po, i =>
      {
          Console.WriteLine("{0} on Task {1}", i, Task.CurrentId);
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多