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



我有两个线程,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/处理器可以按任意顺序执行它。锁不会告诉它正确的执行顺序是什么,而只是告诉它一个线程在,其他线程必须等待。

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

也许,你想看看这些文章

  • https://www.tutorialspoint.com/csharp/csharp_multithreading.htm
  • https://www.codeproject.com/Articles/26130/Threads-and-Thread-Synchronization-in-C
  • http://www.albahari.com/threading/
  • https://www.codingame.com/playgrounds/4240/your-ultimate-async-await-tutorial-in-c/introduction

相关内容

  • 没有找到相关文章

最新更新