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

问题描述 投票:0回答:1

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

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

c# multithreading locking global-variables
1个回答
1
投票

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

所以,你的程序运行正常。如果你想在一个订单中执行它,你不需要线程,或者你可以使用任何async / await方法来同步它们,或者你可以让它进入睡眠状态。

也许,你想看看这些文章

© www.soinside.com 2019 - 2024. All rights reserved.