Функция atomic.StoreInt32
Функция atomic.StoreInt32 атомарно записывает
указанное значение в переменную типа int32.
Это гарантирует, что запись будет выполнена как
единая неделимая операция, что особенно важно
в конкурентных программах, где несколько горутин
могут одновременно обращаться к одной переменной.
Первым параметром функция принимает указатель на
переменную int32, вторым - новое значение,
которое нужно записать.
Синтаксис
atomic.StoreInt32(addr *int32, val int32)
Пример
Давайте запишем значение в переменную с помощью
функции atomic.StoreInt32 и проверим
результат с помощью функции atomic.LoadInt32:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value int32 = 0
atomic.StoreInt32(&value, 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 < 5; i++ {
wg.Add(1)
go func(val int32) {
defer wg.Done()
atomic.StoreInt32(&value, val)
}(int32(i * 10))
}
wg.Wait()
res := atomic.LoadInt32(&value)
fmt.Println(res)
}
Результат выполнения кода:
40
Обратите внимание, что результат может быть любым значением из записанных, так как горутины выполняются конкурентно, но атомарность каждой записи гарантирует, что значение будет целостным.
Пример
Пример использования atomic.StoreInt32
для обновления общего счетчика:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter int32 = 0
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go func() {
defer wg.Done()
newVal := atomic.LoadInt32(&counter) + 1
atomic.StoreInt32(&counter, newVal)
}()
}
wg.Wait()
res := atomic.LoadInt32(&counter)
fmt.Println(res)
}
Результат выполнения кода:
3
В этом примере каждая горутина читает текущее значение счетчика, увеличивает его на 1 и записывает обратно. Благодаря атомарным операциям мы избегаем состояния гонки.
Смотрите также
-
функцию
atomic.LoadInt32,
которая атомарно читает значение типа int32 -
функцию
atomic.AddInt32,
которая атомарно прибавляет значение к переменной типа int32 -
функцию
atomic.SwapInt32,
которая атомарно заменяет значение и возвращает предыдущее -
функцию
sync.Mutex,
которая обеспечивает взаимное исключение для критических секций