C#多线程逻辑错误
我不熟悉多线程,但我不知道我的代码有什么问题:C#多线程逻辑错误,c#,multithreading,threadpool,C#,Multithreading,Threadpool,我不熟悉多线程,但我不知道我的代码有什么问题: 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.QueueUserWorkIte
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();
}
我期望在10,9,8,7,6,5,4,3,2,1,0中有一个输出
请告诉我这有什么问题
我试图一次运行两个线程
怎么办
编辑:在rohit的回答之后,我尝试了这个,但得到了以下输出:
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重复了两次。这里的问题是两个线程都在处理类的同一个实例变量
k
。
因此,当一个线程修改该值时,它会反映在另一个线程中。
输出总是不确定的。好像我得到了这个输出-
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();
}
public void aki(对象ab)
{
int k=10;//=0);//打印0应小于等于0。
如果(k<0)Thread.CurrentThread.Abort();
}
为什么要将锁定
?它不会让其他线程并行处理。我需要锁,这样就不会发生这种情况。。。[守则]螺纹11 VAU=10螺纹12 VAU=9螺纹12 VAU=8螺纹11 VAU=7螺纹11 VAU=6螺纹6 VAU=7螺纹6 VAU=6螺纹6 VAU=5螺纹13 VAU=3线程14 VAU=2线程14 VAU=11)永远不要中止池线程2)您的SetText1()
可能是线程安全的,但即使读取textBox1。线程中的文本也不安全。因此,我应该使用什么来代替中止…?在这种情况下,一个简单的返回代码>或中断代码>声明就足够了。它只会让讨论和回答变得更加困难。
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();
}