2014-01-27 40 views
0

我想要什麼來實現的:Paralle.For最大線程數和當前線程C#

使用的Parallel.For(別的,將不勝感激,卻發現了這是一個最簡單的),我想增加一個名爲變量最大,使其得到100000000,使用線程,但計劃應在同一時間只能使用線程的X個。

一小段代碼片段:

using System; 
using System.Threading; 
using System.Linq; 
using System.Threading.Tasks; 

using System.Diagnostics; 

namespace pool_threading 
{ 
    class MainClass 
    { 
     static int max=0; 
      static int current_max_thread=0; 
     public static void Main (string[] args) 
     { 

      Parallel.For(0, 100000000, new ParallelOptions { MaxDegreeOfParallelism = 50 }, 
      i => 
      { 
          max++; 
       if(Thread.CurrentThread.ManagedThreadId>current_max_thread) 
           current_max_thread=Thread.CurrentThread.ManagedThreadId; 
      }); 

      Console.WriteLine ("I got to this number {0} using most {1} threads",max,current_max_tread); 
     } 
     public static void GetPage(int i) 
     { 
     } 

    } 
} 

結果:

我使用最多11個線程

現在這個數字38786886 ......我不知道爲什麼我得到小於38786886的數字38786886,但我想這是因爲多個線程試圖在同一個ti處增加它我,所以如果10個人在同一時間嘗試,只有第一個人會有機會。如果我錯了,請糾正我。

最大的「問題」是,我得到11個線程的時候,即使是最大設定到50(滾動碼看最大),如果將它設置爲最高1線,我總是得到4(也許4是這種情況下的最小值,但它仍然不能解釋爲什麼我同時只能得到11個最大值)。

+0

爲什麼你需要完全'X'的線程數? – jamesthollowell

回答

1

有兩件事情怎麼回事,據我可以看到:

首先,您從多個線程對max罵個不停。你可能有一個多核機器。這些行動可能相互重疊。要在一個線程安全的方式來執行你的遞增,你需要

Interlocked.Increment(ref max); 

max++; /* not thread safe */ 

其次,你並不總是得到你要求在MaxDegreeOfParallelism線程數。你永遠不會得到更多,但你可能會減少。

如果您要使用並行性,請密切關注您將在線程中運行的代碼的線程安全性。

+0

wassup與downvote?我犯了一個錯誤嗎? –

2

這是微不足道的,只使用i的循環,而不是試圖增加和使用max內。你不會安全地增加它,但你沒有理由嘗試。的Parallel.For整個是,它給你的循環指標,並確保每個循環指標被擊中只有一次,沒有更多,不會少。

+0

我只想運行例如一個函數1000次,但同時具有X個線程數,而不是1個線程,而不是1000個線程。另外,與我而不是最大它的作品。 – icebox19

+0

@ icebox19然後使用並行。這就是它的目的,這就是它會做的。 – Servy

+0

這就是我正在使用的,但它不會同時超過11個線程 – icebox19

0

我相信你沒有得到2原因主要有50個線程:

  1. 硬件。處理器可以用更少的線程完成更多的工作,因爲切換線程所花費的時間不僅僅是更頻繁地運行線程。這導致

  2. 託管代碼。 C#.NET是一個託管代碼系統。 .Net的程序員知道上面的內容,可能會設置一些限制和檢查以防止太多線程運行。您在代碼中設置的內容可能會高於某些內部限制,因此它被有效忽略。此外,您正在設置最大值,因此Parallel.For()可以使用1到X個線程中的任意位置,無論它認爲哪個線程效率最高。