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的原始值,无论交换是否发生。
我不知道为什么,但我似乎无法完全理解 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的原始值,无论交换是否发生。