2013-11-09 44 views
3

我使用的Parallel.For设置:的Parallel.For线程创建

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

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

+0

你知道你在哪里运行此代码你不忘记线程?这被视为这4个线程中的一个,但它可能不是一个工作线程(取决于你如何确定它的含义)。 – svick

回答

1

这是因为它说MaxDegreeOfParallelism,所以不会去上面,但它不会使用超过必要无论是。

这就是它说MSDN

默认情况下,和foreach将利用然而,许多线程底层的调度程序提供,所以从默认的改变MaxDegreeOfParallelism唯一的限制多少并发任务将被使用。 `

+0

这就是我理解它。但是,我正在比较相同算法的F#版本,在相同条件下运行。 F#版本总是使用4个线程,而C#版本总是使用3,我发现它很奇怪... –

+0

如果你需要4个线程,然后使用4个线程。在普通的'For'循环中创建任务。 (顺便说一下,如果这个算法没有很快完成,你应该标记任务LongRunning) –

+0

这仍然不能解释行为。没有人质疑这种行为是合法的,但是*为什么*? – usr

0

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

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

如果要强制使用4您可以编写自己的调度。

0

如前所述,你只可以指定最大,而不是线程的实际数量。如果你有四个可用内核,以及工作量平凡,并行的线程所有四个来看,你开始从也被用于执行工作项的For

此外,Parallel.For 5块的输入范围。它可能不会用于四件物品,但如果您担心,您可以使用Parallel.Invoke()一次安排4件物品。

0

Parralel.For不知道你会多少刺激向它提出的,其灵活的,它处理线程队列,在运行时它决定哪些可用的核心是接收从threadque一定的工作线程。核心可能不可用,因为它不仅仅是在Windows计算机上运行的代码。或者一个核心可能仍然会在你之前的工作负载中变得繁忙。

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