2013-11-09 41 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/