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

Функция 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,
    которая обеспечивает взаимное исключение для критических секций
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить