我正在使用parallel.for设置:
Parallel.For(0, 4, new ParallelOptions { MaxDegreeOfParallelism = 4 }, j =>
我希望它能创建4个工作线程,但并发可视化工具只显示正在使用3个工作线程。我试图使用最大并行度和处理器亲和度,但在每种情况下只使用3个工作线程,而不是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/