1

典型的比较和交换指令不会报告它是否成功。相反,它无论如何都只返回旧值。如何快速确定 CAS 是否成功更新了值?

CAS(location, compareValue, newValue):
  oldValue = *location
  if (oldValue == compareValue)
    *location = newValue;
  return oldValue ;
4

1 回答 1

2

这很简单,您只需将返回的(旧)值与用于比较的一个 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*() 函数的使用方式。

于 2011-11-23T06:25:37.507 回答