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