我有两个线程,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早增加计数。
希望有人能帮助我,谢谢。
怎么了?实际上,您在代码中定义或启动的顺序并不会告诉您的计算机如何执行。实际上,您有两个完全分离的线程,您的VM / Processor可以按任何顺序执行它。锁不会告诉它什么是正确的执行顺序,但只有一个Thread进入,其他线程必须等待。
所以,你的程序运行正常。如果你想在一个订单中执行它,你不需要线程,或者你可以使用任何async / await方法来同步它们,或者你可以让它进入睡眠状态。
也许,你想看看这些文章