Функция atomic.LoadInt32
Функция atomic.LoadInt32 используется для атомарного чтения
32-битного целого числа (тип int32) из памяти. В первый параметр
мы передаем указатель на переменную типа int32, значение которой
хотим атомарно прочитать. Функция возвращает текущее значение этой
переменной. Это гарантирует, что операция чтения будет выполнена
неделимо и результат не будет содержать промежуточных значений,
возникающих при конкурентной записи.
Синтаксис
atomic.LoadInt32(addr *int32) int32
Пример
Давайте рассмотрим базовый пример использования функции
atomic.LoadInt32 для чтения значения переменной:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value int32 = 100
res := atomic.LoadInt32(&value)
fmt.Println(res)
}
Результат выполнения кода:
100
Пример
Теперь рассмотрим пример, демонстрирующий атомарное чтение в конкурентной среде. В нескольких горутинах одновременно записывается и читается значение:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var value int32 = 0
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
atomic.AddInt32(&value, 1)
wg.Done()
}()
}
wg.Wait()
res := atomic.LoadInt32(&value)
fmt.Println(res)
}
Результат выполнения кода:
1000
Пример
Используем функцию atomic.LoadInt32 вместе с
atomic.CompareAndSwapInt32 для безопасной проверки
и изменения значения:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value int32 = 10
oldValue := atomic.LoadInt32(&value)
if atomic.CompareAndSwapInt32(&value, oldValue, 20) {
fmt.Println("Update successful")
}
res := atomic.LoadInt32(&value)
fmt.Println(res)
}
Результат выполнения кода:
"Update successful"
20
Смотрите также
-
функцию
atomic.StoreInt32,
которая атомарно записывает значение в переменную -
функцию
atomic.AddInt32,
которая атомарно прибавляет число к переменной -
функцию
atomic.CompareAndSwapInt32,
которая атомарно сравнивает и обменивает значение -
функцию
atomic.SwapInt32,
которая атомарно заменяет значение и возвращает старое