通常のコンペア アンド スワップ命令は、成功したかどうかを報告しません。代わりに、関係なく古い値を返すだけです。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*() 関数の使用方法です。