Parallel.For线程创建

时间:2013-11-09 17:28:18

标签: c# performance task-parallel-library parallel.foreach

我正在使用parallel.for设置:

Parallel.For(0, 4, new ParallelOptions { MaxDegreeOfParallelism = 4 }, j =>

我希望它能创建4个工作线程,但并发可视化工具只显示正在使用3个工作线程。我试图使用最大并行度和处理器亲和度,但在每种情况下只使用3个工作线程,而不是4.是否有明显的答案为什么会发生这种情况?欢呼声

4 个答案:

答案 0 :(得分:1)

正如它所说MaxDegreeOfParallelism,所以它不会超过它,但它也不会超过认为必要的使用。

这就是它在MSDN上所说的内容:

  

默认情况下,For和ForEach将使用底层调度程序提供的许多线程,因此从默认值更改MaxDegreeOfParallelism仅限制将使用多少并发任务。

答案 1 :(得分:0)

这是设计上的,我不记得我在哪里阅读它,但是它使用了下面的线程池,它只需要执行任务,因为有处理器能力这样做。 虽然C#和F#之间存在差异听起来很奇怪。

理论上,它还应该依赖于可用的处理器内核。如果只有一个核心,那么就不需要启动多个线程。

如果你想强制它使用4,你可以编写自己的调度程序。

答案 2 :(得分:0)

如上所述,您只能指定最大值,而不是实际的线程数。如果您有四个可用内核,并且工作负载非常重要,那么所有四个并行运行,因为您启动For的线程也用于执行工作项。

此外,Parallel.For可能会缩小您的输入范围。它可能不适用于四个项目,但如果您担心,可以使用Parallel.Invoke()一次安排4个项目。

答案 3 :(得分:0)

Parralel.For不知道你会对它施加多大的烦恼,它的灵活性,它处理线程队列,并在运行时决定什么可用的核心从线程接收某个工作线程。核心可能不可用,因为不仅是您的代码在Windows机器上运行。或者核心可能仍然是你给它的先前工作量的忙。

这里有更深入的信息http://reedcopsey.com/2010/01/26/parallelism-in-net-part-5-partitioning-of-work/