使用C#中的任务并行库为每个处理器运行一个并行任务

时间:2012-05-10 04:57:35

标签: .net multithreading c#-4.0 parallel-processing task-parallel-library

使用任务并行库时,是否可以确保我当时每个处理器只运行一个任务?如果没有,在C#中执行此操作的最佳方法是什么?

注意:我不是为了提高性能,而是为了使每项任务的时间更加可靠。有关详细信息,请参阅此问题:Timing of parallel actions using the Task Parallel Library in C#

2 个答案:

答案 0 :(得分:5)

首先,如果你想拥有绝对可靠的时机,那么使用Windows和.Net并不是正确的选择。 Windows,因为它不是real-time OS,它可以根据系统中发生的其他事情为您的代码选择不同的时间。 .Net不是一个好的选择,因为垃圾收集器具有非确定性的时序。

但如果你只是想让时间更可靠,你可以做一些事情。

如果您想在自己的处理器上运行每个线程,您可以手动创建Thread,然后为每个线程设置ProcessThread.ProcessorAffinity,但getting the ProcessThread for a Thread is not that simple

如果您只是想确保所有任务立即开始(无论ThreadPool上当前正在运行的其他任务),您也应该创建自己的Thread

但如果您只想确保每个处理器最多只有 一个任务,那么只需将MaxDegreeOfParallelism设置为Environment.ProcessorCount

答案 1 :(得分:1)

您可以使用ParallelOptions指定最大并行度。但是这是一个上限,它不会强制每个核心一个线程,其他约束可能意味着使用更少的核心。

e.g。

var list = new List<int>();
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 4;

Parallel.ForEach(list, options);