C#多线程逻辑错误

本文关键字:错误 多线程 | 更新日期: 2023-09-27 18:25:04

我是多线程的新手,但我不知道我的代码有什么问题:

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,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重复两次。

C#多线程逻辑错误

这里的问题是两个线程都在类的同一实例变量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();    
}