Функция atomic.LoadUint32
Функция atomic.LoadUint32 атомарно загружает значение
32-битного беззнакового целого (uint32) из переданного
указателя. Она гарантирует, что чтение будет выполнено как
единая неделимая операция, что особенно важно при работе с
данными, разделяемыми между несколькими горутинами.
В качестве единственного параметра функция принимает указатель
на переменную типа uint32, а возвращает её текущее
значение.
Синтаксис
atomic.LoadUint32(addr *uint32) uint32
Пример
Давайте создадим переменную типа uint32 со значением
100 и атомарно прочитаем её с помощью atomic.LoadUint32:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var counter uint32 = 100
res := atomic.LoadUint32(&counter)
fmt.Println(res)
}
Результат выполнения кода:
100
Пример
Рассмотрим более практический пример, где несколько горутин атомарно инкрементируют счётчик, а мы читаем его финальное значение:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter uint32
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
atomic.AddUint32(&counter, 1)
}()
}
wg.Wait()
res := atomic.LoadUint32(&counter)
fmt.Println(res)
}
Результат выполнения кода:
1000
Пример
Если переменная не изменяется конкурентно, то можно использовать
обычное чтение, но atomic.LoadUint32 всё равно обеспечивает
гарантию видимости изменений между горутинами:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value uint32 = 42
go func() {
atomic.StoreUint32(&value, 100)
}()
// Гарантируем видимость изменения
res := atomic.LoadUint32(&value)
fmt.Println(res)
}
Результат выполнения кода (может быть 42 или 100 в зависимости от времени выполнения горутины):
42
Смотрите также
-
функцию
atomic.StoreUint32,
которая атомарно записывает значение в переменную -
функцию
atomic.AddUint32,
которая атомарно прибавляет значение к переменной -
функцию
atomic.SwapUint32,
которая атомарно обменивает значение на новое и возвращает старое -
функцию
atomic.CompareAndSwapUint32,
которая выполняет атомарное сравнение и обмен значениями