2013-07-27 52 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