TPL中的并行编程

时间:2010-12-02 21:09:08

标签: c# vb.net parallel-processing

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

4 个答案:

答案 0 :(得分:1)

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

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

然而,这听起来不适合你的账单,所以也许你需要细粒度的控制,在这种情况下我建议你直接使用线程。

答案 1 :(得分:1)

  

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

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

答案 2 :(得分:1)

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

CodePlex上有一个ParallelExtensionsExtras库,它有various task schedulers,其中一个是“每个任务的线程”调度程序,另一个(LimitedConcurrencyLevelTaskScheduler)允许你指定并行度。< / p>

但是,它们不向特定核心提供线程亲和性。你必须自己编写代码。

答案 3 :(得分:0)

我刚才注意到有一种方法可以控制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);
});