典型的比较和交换指令不会报告它是否成功。相反,它无论如何都只返回旧值。如何快速确定 CAS 是否成功更新了值?
CAS(location, compareValue, newValue):
oldValue = *location
if (oldValue == compareValue)
*location = newValue;
return oldValue ;
典型的比较和交换指令不会报告它是否成功。相反,它无论如何都只返回旧值。如何快速确定 CAS 是否成功更新了值?
CAS(location, compareValue, newValue):
oldValue = *location
if (oldValue == compareValue)
*location = newValue;
return oldValue ;
这很简单,您只需将返回的(旧)值与用于比较的一个 CAS 本身进行比较。
if (CAS(location, compareValue, newValue) == compareValue)
{
// CAS successfully wrote newValue to location
}
else
{
// CAS failed to write newValue to location
}
这就是 x86 的 CMPXHG(8B/16B) 指令和构建在它们之上的 MSVC++ 的 InterlockedCompareExchange*() 函数的使用方式。