Следующая строка
c = atomic_read(v);
означает, в данный момент мы знаем, что значение переменной atomic_v == с. We декремент c, чтобы дать нам наше требуемое значение.
dec = c - 1;
Очевидно, что если число не является положительным и 0 не является положительным, мы не можем декремент это.
if (unlikely(dec < 0))
break;
Теперь мы пытаемся изменить наш известный старый результат с ожидаемым результатом
old = atomic_cmpxchg((v), c, dec);
Это определяется как
int atomic_cmpxchg(atomic_t *v, int old, int new);
Если мы запишем его следующим образом, и предположим, что в целом функция атомарна. У нас есть
int atomic_cmpxchg(atomic_t *v, int old, int new) {
&v->counter = &v->counter == old ? new : old;
return old;
}
Примечания, я лечение v
как целое число, на x86 это структура. На этом этапе мы знаем, что в точке выполнения атомной операции мы получаем старое значение . Наше ожидаемое старое значение - c
, так что если это так, то у нас успешно уменьшено значение, верните результат.
if (likely(old == c))
break;
Если нам не нужно сбросить наш expectataion т.е. нашей начальной точки, мы декремента новое значение c
не старый один у нас был, когда в последний раз вошел в for(;;)
петлю
c = old;
Важной частью вот что это в цикле, этот цикл будет продолжаться до тех пор, пока ему не удастся уменьшить значение или значение не положительно.
Можете ли вы объяснить сценарий, в котором вы думаете, что он ведет себя неатомно? –