Это тривиально, вы просто сравниваете возвращенное (старое) значение с тем, которое сам 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 * ()используются функции, которые построены поверх них.