2013-07-27 49 views
-1

我是新來的多線程,但我不知道什麼是錯我的代碼:C#多線程的邏輯錯誤

public int k; 
private void button2_Click(object sender, EventArgs e) 
{ 
    k = 10; 
    ThreadPool.SetMinThreads(2, 6); 
    ThreadPool.SetMaxThreads(2, 6); 
    ThreadPool.QueueUserWorkItem(aki); 
    ThreadPool.QueueUserWorkItem(aki); 
} 

public void aki(object ab) 
{ 
    do 
     { 
      this.SetText1(textBox1.Text + 
      " thread  " + Thread.CurrentThread.GetHashCode() + 
      "    valu= " + k + Environment.NewLine); 
      k--; 
     } while (k > 0); 
     if (k < 0) Thread.CurrentThread.Abort();  
} 

針對上述情況,我得到了以下的輸出:

thread  11    valu= 10 
thread  11    valu= 8 
thread  11    valu= 6 
thread  11    valu= 4 
thread  11    valu= 2 
thread  10    valu= 0 

我在10,9,8,7,6,5,4,3,2,1,0

預期的輸出請指導我對什麼是錯。

我試圖一次運行兩個線程。

怎麼辦?

編輯:羅希特的回答後,我試過,但我得到了以下的輸出:

thread  11    valu= 10 
thread  12    valu= 9 
thread  12    valu= 8 
thread  11    valu= 7 
thread  11    valu= 6 
thread  6    valu= 7 
thread  6    valu= 6 
thread  6    valu= 5 
thread  13    valu= 3 
thread  14    valu= 2 
thread  14    valu= 1 

在此運行,7和6的重複兩次。

+0

1)永遠不要放棄一池線程 –

+0

2)你'SetText1()'可能是線程 - 安全但即使讀取'textBox1.Text'對於線程來說是不安全的。 –

+0

那麼,我應該使用什麼,而不是中止...? – Aki003

回答

1

這裏的問題是線程在你的類的同一個實例變量k上工作。 那麼,當one thread modifies的值,它gets reflected in other thread。 輸出將始終是不確定的。像我得到這個輸出 -

thread  18    valu= 10 
thread  21    valu= 10 
thread  18    valu= 9 
thread  18    valu= 7 
thread  18    valu= 6 
thread  18    valu= 5 
thread  18    valu= 4 
thread  18    valu= 3 
thread  18    valu= 2 
thread  18    valu= 1 
thread  21    valu= 8 

你應該使用局部變量裏面aki方法 -

public void aki(object ab) 
{ 
    int k = 10; // <---- HERE 
    do 
     { 
      this.SetText1(textBox1.Text + 
          " thread  " + Thread.CurrentThread.GetHashCode() + 
          "    valu= " + k + Environment.NewLine); 
      k--; 
     } while (k >= 0); // It should be less than and equal to 0 to print 0. 
     if (k < 0) Thread.CurrentThread.Abort();  
} 
+0

甜蜜...完美的作品,請你也可以告訴我應該在哪裏鎖... – Aki003

+0

爲什麼你想把'鎖'?它不會讓其他線程來處理paralley。 –

+0

我需要鎖定所以不會發生這種情況... [代碼]螺紋11 VALU = 10 螺紋12 VALU = 9 螺紋12 VALU = 8 螺紋11 VALU = 7 螺紋11 VALU = 6 螺紋6 VALU = 7 線程6的值= 6 線程6的值= 5 線程13的值= 3 線程14的值= 2 線程14的值= 1 – Aki003