两个线程访问全局变量时出现意外结果

时间:2019-03-29 08:13:25

标签: c# multithreading locking global-variables

我有两个线程,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来增加计数。

希望有人可以帮我,谢谢。

1 个答案:

答案 0 :(得分:1)

怎么了?实际上,您在代码中定义或启动的顺序不会告诉您计算机如何执行。实际上,您有两个完全分开的线程,您的VM /处理器可以按任何顺序执行它。锁不会告诉它正确的执行顺序是什么,而是只有一个线程在其中,其他线程必须等待。

因此,您的程序运行正常。如果要按顺序执行它,则不需要线程,或者可以使用任何async / await方法来同步它们,也可以使其中一个进入睡眠状态。

也许您想看看这些文章