AS
Size: a a a
AS
ВС
zl
zl
AS
zl
val := atomic.LoadUint64(vPtr)
for !atomic.CompareAndSwapUint64(vPtr, val, val - 1) {
val = atomic.LoadUint64(vPtr)
}
AS
zl
DP
DP
zl
ВС
AS
atomic.CompareAndSwapUint64
. Она устанавливает в первый параметр значение только если оно равно второму параметру и эта операция атомарна. Если проверка не удалась (кто-то другой поменял значение в переменной до нас), то функция вернет false
, и тогда мы считаем актуальное значение переменной в нашу, и попробуем повторить декремент. И так до тех пор пока у нас не получитсяzl
zl
AS
zl
AS
ВС
zl