这是对我之前的一个问题的解释。这是一个简单的线程问题,但我似乎无法理解。
如果我有共享代码:
private static object objSync = new object();
private int a = 0;
public void function()
{
lock(objSync)
a += 2;
lock(objSync)
a += 3;
Console.WriteLine(a.ToString());
a=0;
}
我不能期望 'a' 最终等于 5,因为第一个线程获得了一个锁,将 'a' 设置为 2,然后下一个线程可以在第一个线程能够之前获得一个锁,将其设置为 '4'加 3,最后你会得到 7。
据我了解,解决方案是在整个事情上加一个锁,然后你总是可以期待 5 个。现在我的问题是,如果在两个锁之间有一百万行代码怎么办。我无法想象将一百万行代码放在一起。您将如何通过在大约一百万两行代码中加锁来确保线程安全,但又不会导致性能失败?
编辑:
这是我为这个问题编写的废话代码。实际应用是线路监控系统。有两个屏幕显示当前线路,一个用于文员,一个用于公众。职员的屏幕通过串行端口接受“点击”,串行端口逐行推进,然后通过通知事件更新公共屏幕(参见观察者设计模式)。问题是,如果您向答题器发送垃圾邮件,它们不会同步。我想发生的事情是第一个屏幕添加到行号,显示它然后更新公共屏幕,但是在公共屏幕有机会显示数据库中的行号之前,店员再次点击,数字消失了同步。上面的“a”代表我从数据库中检索的一个值,而不仅仅是一个简单的 int。