【问题标题】:Running one parallel task per processor using the Task Parallel Library in C#使用 C# 中的任务并行库为每个处理器运行一个并行任务
【发布时间】:2012-05-10 04:57:34
【问题描述】:

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

注意:我这样做不是为了提高性能,而是为了让每个任务的时间安排更可靠。有关更多信息,请参阅此问题:Timing of parallel actions using the Task Parallel Library in C#

【问题讨论】:

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


    【解决方案1】:

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

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

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

    如果您只想确保所有任务立即启动(无论ThreadPool 上当前正在运行什么其他任务),您也应该创建自己的Threads。

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

    【讨论】:

      【解决方案2】:

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

      例如

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

      【讨论】:

        猜你喜欢
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-27
        • 1970-01-01
        • 2016-09-20
        • 1970-01-01
        相关资源
        最近更新 更多