Как я узнаю, что инструкция CAS прошла успешно? - PullRequest
1 голос
/ 23 ноября 2011

Типичная инструкция сравнения и обмена не сообщает, была ли она успешной.Вместо этого он просто возвращает старое значение независимо.Как я могу очень быстро определить, успешно ли CAS обновил значение?

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

1 Ответ

2 голосов
/ 23 ноября 2011

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

...