РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
887 of 1593 menu

Функция atomic.CompareAndSwapInt32

Функция atomic.CompareAndSwapInt32 выполняет атомарную операцию сравнения и замены (CAS) для значения типа int32. В первый параметр (указатель) передается адрес переменной, значение которой нужно сравнить и при необходимости заменить. Во второй параметр передается ожидаемое значение (старое), с которым сравнивается текущее значение переменной. В третий параметр передается новое значение, которое будет записано в переменную, если текущее значение равно ожидаемому. Функция возвращает true, если замена была выполнена, и false, если текущее значение не совпало с ожидаемым (операция не выполнена).

Синтаксис

atomic.CompareAndSwapInt32(addr, old, new)

Пример успешной замены

Давайте попробуем выполнить атомарную замену, когда текущее значение переменной совпадает с ожидаемым:

package main import ( "fmt" "sync/atomic" ) func main() { var x int32 = 10 swapped := atomic.CompareAndSwapInt32(&x, 10, 42) fmt.Println(swapped) fmt.Println(x) }

Результат выполнения кода:

true 42

Пример неуспешной замены

А теперь попробуем выполнить замену, когда текущее значение не совпадает с ожидаемым:

package main import ( "fmt" "sync/atomic" ) func main() { var x int32 = 10 swapped := atomic.CompareAndSwapInt32(&x, 5, 42) fmt.Println(swapped) fmt.Println(x) }

Результат выполнения кода:

false 10

Использование в цикле для атомарного обновления

Часто atomic.CompareAndSwapInt32 используется в цикле для надежного атомарного изменения значения, если операция не требует вызова функции с получением старого значения:

package main import ( "fmt" "sync/atomic" ) func main() { var x int32 = 5 old := x for !atomic.CompareAndSwapInt32(&x, old, old+1) { old = x } fmt.Println(x) }

Результат выполнения кода:

6

Смотрите также

  • функцию atomic.CompareAndSwapInt64,
    которая работает с 64-битными целыми числами
  • функцию atomic.SwapInt32,
    которая атомарно заменяет значение без проверки
  • функцию atomic.LoadInt32,
    которая атомарно читает значение
  • функцию atomic.StoreInt32,
    которая атомарно записывает новое значение
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить