Тип atomic.Uint32

Тип atomic.Uint32 из пакета sync/atomic представляет собой атомарное беззнаковое 32-битное целое число. Он предоставляет методы для безопасного выполнения операций чтения, записи, сложения и сравнения с обменом без использования явных блокировок. Этот тип полезен для счетчиков, флагов и других числовых значений, к которым обращаются из нескольких горутин.

Синтаксис

govar v atomic.Uint32
v.Store(100)
value := v.Load()
v.Add(10)

Пример

Давайте создадим счетчик с использованием atomic.Uint32 и инкрементируем его из нескольких горутин:

gopackage main

import (
  "fmt"
  "sync"
  "sync/atomic"
)

func main() {
  var counter atomic.Uint32
  var wg sync.WaitGroup

  for i := 0; i < 1000; i++ {
    wg.Add(1)
    go func() {
      defer wg.Done()
      counter.Add(1)
    }()
  }

  wg.Wait()
  fmt.Println(counter.Load())
}

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

go1000

Пример

Используем методы Store и Load для безопасной записи и чтения значения:

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var val atomic.Uint32

  val.Store(42)
  fmt.Println(val.Load())

  val.Store(100)
  fmt.Println(val.Load())
}

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

go42
100

Пример

Метод CompareAndSwap атомарно сравнивает значение с ожидаемым и заменяет его на новое, если они равны:

gopackage main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  var val atomic.Uint32
  val.Store(10)

  swapped := val.CompareAndSwap(10, 20)
  fmt.Println(swapped)
  fmt.Println(val.Load())

  swapped = val.CompareAndSwap(10, 30)
  fmt.Println(swapped)
  fmt.Println(val.Load())
}

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

gotrue
20
false
20

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

  • тип atomic.Uint64,
    который предоставляет атомарное беззнаковое 64-битное целое
  • тип atomic.Int32,
    который предоставляет атомарное знаковое 32-битное целое
  • функцию atomic.AddUint32,
    которая атомарно прибавляет значение к uint32
  • функцию atomic.LoadUint32,
    которая атомарно загружает значение типа uint32