首页 > 解决方案 > 两个线程访问全局变量时的意外结果

问题描述

我有两个线程,t1 和 t2。
它们都对名为“count”的全局变量进行了添加操作,该变量使用 0 初始化。
t1count++和 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 更早地添加计数。

希望有人能帮帮我,谢谢。

标签: c#multithreadinglockingglobal-variables

解决方案


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

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

也许,你想看看这些文章


推荐阅读