解决c#中的线程冲突

本文关键字:线程 冲突 解决 | 更新日期: 2023-09-27 18:14:54

让我们假设有一个静态变量被两个线程访问。

public static int val = 1;

现在假设线程1执行如下语句

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

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

这会导致一些严重的错误。这是发生在我的代码。

线程1是否有办法注意到val的值已经改变,它不是添加,而是返回并再次执行检查

解决c#中的线程冲突

对于您的示例,您可以:

var originalValue = Interlocked.CompareExchange(ref val, 
                                    2,       //update val to this value
                                    1);      //if val matches this value
if(originalValue == 1)
{
    //the update occurred
}

可以使用锁:

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`
}

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

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