我有两个线程,t1和t2。
它们都对名为“ count”的全局变量进行添加操作,该全局变量已初始化为0。
t1做count++
,t2做count+=100
。我先启动t1,然后再启动t2,但是输出结果不符合我的期望。
我有误会吗?
即使我在两个线程中使用了lock()也无济于事。
这是C#代码:
private int count = 0;
private object locker = new object();
void run()
{
var t1 = new Thread(Add_1);
var t2 = new Thread(Add_2);
t1.Start();
t2.Start();
}
void Add_1()
{
lock(locker)
{
count++;
Console.WriteLine(count);
}
}
void Add_2()
{
lock(locker)
{
count += 100;
Console.WriteLine(count);
}
}
有时会打印
1
101
或
100
101
我对此一无所知。我认为,t1应该有储物柜,直到完成工作为止。但是看来t2有机会早于t1来增加计数。
希望有人可以帮我,谢谢。
答案 0 :(得分:1)
怎么了?实际上,您在代码中定义或启动的顺序不会告诉您计算机如何执行。实际上,您有两个完全分开的线程,您的VM /处理器可以按任何顺序执行它。锁不会告诉它正确的执行顺序是什么,而是只有一个线程在其中,其他线程必须等待。
因此,您的程序运行正常。如果要按顺序执行它,则不需要线程,或者可以使用任何async / await方法来同步它们,也可以使其中一个进入睡眠状态。
也许您想看看这些文章