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

Тип atomic.Int32

Тип atomic.Int32 предоставляет атомарные операции над 32-битным целым числом со знаком. Этот тип из пакета sync/atomic позволяет безопасно выполнять операции над числом из нескольких горутин без использования мьютексов. Основные методы типа: Load для чтения значения, Store для записи, Add для прибавления числа, Swap для обмена значения и CompareAndSwap для условной замены значения.

Синтаксис

var num atomic.Int32 num.Store(42) value := num.Load() num.Add(10) old := num.Swap(100) swapped := num.CompareAndSwap(100, 200)

Пример

Давайте создадим атомарную переменную и выполним базовые операции с ней:

package main import ( "fmt" "sync/atomic" ) func main() { var num atomic.Int32 // Store value num.Store(42) fmt.Println("Stored value:", num.Load()) // Add value num.Add(10) fmt.Println("After add 10:", num.Load()) // Swap value old := num.Swap(100) fmt.Println("Old value:", old) fmt.Println("New value:", num.Load()) // Compare and swap swapped := num.CompareAndSwap(100, 200) fmt.Println("CAS success:", swapped) fmt.Println("Final value:", num.Load()) }

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

"Stored value: 42" "After add 10: 52" "Old value: 52" "New value: 100" "CAS success: true" "Final value: 200"

Пример

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

package main import ( "fmt" "sync" "sync/atomic" ) func main() { var counter atomic.Int32 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:", counter.Load()) }

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

"Counter: 1000"

Пример

Давайте используем метод CompareAndSwap для безопасного обновления значения только если оно не изменилось:

package main import ( "fmt" "sync/atomic" ) func main() { var value atomic.Int32 value.Store(100) // Try to update if value is still 100 ok := value.CompareAndSwap(100, 200) fmt.Println("First CAS:", ok) fmt.Println("Value:", value.Load()) // Try to update if value is still 100 (it's now 200) ok = value.CompareAndSwap(100, 300) fmt.Println("Second CAS:", ok) fmt.Println("Value:", value.Load()) }

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

"First CAS: true" "Value: 200" "Second CAS: false" "Value: 200"

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

  • тип atomic.Int64,
    атомарное 64-битное целое число
  • тип atomic.Uint32,
    атомарное 32-битное беззнаковое целое
  • функцию atomic.AddInt32,
    атомарное сложение для int32
  • тип sync.Mutex,
    мьютекс для синхронизации доступа к данным
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить