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

Функция atomic.CompareAndSwapUint32

Функция atomic.CompareAndSwapUint32 выполняет атомарную операцию сравнения и замены (compare-and-swap) для значения типа uint32. Эта операция является ключевым примитивом синхронизации в конкурентном программировании. В качестве первого аргумента она принимает указатель на uint32, который нужно сравнить и изменить, вторым аргументом - ожидаемое значение, и третьим - новое значение, на которое будет заменено старое, если они совпадают. Функция возвращает true, если операция выполнена успешно, и false в противном случае.

Синтаксис

atomic.CompareAndSwapUint32(addr *uint32, old uint32, new uint32) bool

Пример

Давайте рассмотрим базовый пример использования функции:

package main import ( "fmt" "sync/atomic" ) func main() { var value uint32 = 10 swapped := atomic.CompareAndSwapUint32(&value, 10, 20) fmt.Printf("Operation result: %t, value: %d\n", swapped, value) swapped = atomic.CompareAndSwapUint32(&value, 10, 30) fmt.Printf("Operation result: %t, value: %d\n", swapped, value) }

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

"Operation result: true, value: 20" "Operation result: false, value: 20"

Пример

Продемонстрируем использование функции для атомарного инкремента в конкурентной среде:

package main import ( "fmt" "sync" "sync/atomic" ) func main() { var counter uint32 = 0 var wg sync.WaitGroup const goroutines = 1000 for i := 0; i < goroutines; i++ { wg.Add(1) go func() { defer wg.Done() for { old := atomic.LoadUint32(&counter) new := old + 1 if atomic.CompareAndSwapUint32(&counter, old, new) { break } } }() } wg.Wait() fmt.Printf("Final counter value: %d\n", counter) }

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

"Final counter value: 1000"

Пример

Рассмотрим пример использования функции для реализации простого атомарного флага:

package main import ( "fmt" "sync/atomic" ) func main() { var flag uint32 = 0 if atomic.CompareAndSwapUint32(&flag, 0, 1) { fmt.Println("Flag set successfully") } if atomic.CompareAndSwapUint32(&flag, 0, 1) { fmt.Println("Flag set successfully again") } fmt.Printf("Final flag value: %d\n", flag) }

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

"Flag set successfully" "Final flag value: 1"

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

  • функцию atomic.CompareAndSwapInt32,
    которая выполняет атомарную замену для 32-битного целого числа со знаком
  • функцию atomic.CompareAndSwapUint64,
    которая работает с 64-битными беззнаковыми числами
  • функцию atomic.LoadUint32,
    которая атомарно загружает значение 32-битного числа без знака
  • функцию atomic.StoreUint32,
    которая атомарно записывает значение 32-битного числа без знака
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить