1

让我们假设有一个由 2 个线程访问的静态变量。

public static int val = 1;

现在假设线程 1 执行的是这样的语句

if(val==1)
{
  val +=1
}

然而,在检查之后和上述语句中的添加之前,线程 2 将 val 的值更改为其他值。

现在这会导致一些令人讨厌的错误。这发生在我的代码中。

有什么方法可以让线程 1 注意到 val 的值已更改,而不是添加,而是返回并再次执行检查。

4

4 回答 4

6

特别是对于您的示例,您可以:

var originalValue = Interlocked.CompareExchange(ref val, 
                                    2,       //update val to this value
                                    1);      //if val matches this value
if(originalValue == 1)
{
    //the update occurred
}
于 2013-05-21T18:35:56.813 回答
3

您可以使用锁:

var lockObj = new object();

if(val == 1) // is the value what we want
{
    lock(lockObj) // let's lock it
    {
        if(val == 1) // now that it's lock, check again just to be sure
        {
            val += 1;
        }
    }
}

如果走这条路,您必须确保任何修改的代码val也使用具有相同锁对象的锁。

lock(lockObj)
{
    // code that changes `val`
}
于 2013-05-21T18:24:20.910 回答
0

如果您希望以线程安全的方式递增整数值,可以使用静态Interlocked.Increment方法:Interlocked.Increment Method (Int32)

于 2013-05-21T18:43:21.107 回答
0

您可以在访问 val 或更新 val 时使用锁。请参阅http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

于 2013-05-21T18:24:09.050 回答