2
我试图追查一个我认为可能与应用程序多线程相关的错误。我简化了下面的代码:从外部函数锁定和ref值
class Outer {
private static int count;
//this function is called from multiple threads in quick succession
public void DoFoo() {
Inner.Increment(ref count);
}
}
class Inner {
private readonly static object mLock = new object();
public static string Increment(ref count) {
lock (mLock) (
if (count > 1000)
count = 0;
count++;
}
return count.ToString();
}
}
锁定可以保证以这种方式传递的变量的安全吗?有没有任何复制计数正在进行,似乎并不明显,可能会破坏记忆安全?我在想它可能会返回一个新的int值,并在方法末尾执行赋值操作。除此之外,我的理解是锁定部分可以处理任何缓存问题。
将问题买给我们注意的错误看起来是一个陈旧的count版本的线程之一。
这就是我当时的想法,但是当锁定语句被输入(因为它是一个引用)或者它会坚持陈旧值时它会得到最新值吗? – flukus
@flukus看看我修改后的代码。 – xanatos
这样可以解决陈旧价值从外部传入的问题吗? – flukus