Interlocked.CompareExchange 单线程等效代码

Interlocked.CompareExchange single-threaded equivalent code

我不知道为什么,但我似乎无法完全理解 Interlocked.CompareExchange(ref int a, int b, int c) 中发生的事情。

有人可以告诉我如果在单线程环境中天真地实现它会做什么吗?

即它用 "do that ... but as an atomic, thread-safe operation" 替换了什么代码?

int CompareExchange(ref int location1, int value, int comparand)
{
    if (location1 == null)
        throw new ArgumentNullException(nameof(location1));

    if (location1 != comparand)
    {
        return location1;
    }

    int originalValue = location1;
    location1 = value;
    return originalValue;
}

这是我对代码的理解(在单线程领域):

static int CompareExchange(ref int location1, int value, int comparand)
{
    var valueToReturn = location1;
    if (location1 == comparand)
    {
        location1 = value;
    }

    return valueToReturn;
}

摘自此处的文档:https://docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked.compareexchange

参数

  • 位置 1 (Int32)
    目标,其值与 comparand 进行比较并可能被替换。
  • 值(Int32)
    如果比较结果相等,则替换目标值的值。
  • 比较数 (Int32)
    与 location1 处的值进行比较的值。
  • Returns (Int32)
    location1的原始值。

备注

如果comparand 和location1 中的value 相等,则value 存储在location1 中。否则,不执行任何操作。比较和交换操作作为原子操作执行。 CompareExchange的return值是location1的原始值,无论交换是否发生。