Приращение без блокировки, если оно больше - PullRequest
4 голосов
/ 20 сентября 2011

Кто-нибудь знает о безблокировочном способе выполнения того, что логически эквивалентно compare_and_swap_if_greater_than ()? У нас есть compare_and_swap (), который на самом деле сравнить. Лучшее, что у меня есть сейчас, - это использование спинового мьютекса, но я думаю, что с помощью умения использовать исторические переменные, циклы и compare_and_swap () можно избежать этого.

1 Ответ

1 голос
/ 20 сентября 2011

Как насчет этого:

public static void CompareAndSwapIfGreaterThan(ref int location, int newValue) {
  while(true) {
    var currentValue=Thread.VolatileRead(ref location);
    if(newValue<=currentValue
      || Interlocked.CompareExchange(ref location, newValue, currentValue)==currentValue) {
      return;
    }
  }
}
...