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

Функция atomic.AddUint32

Функция atomic.AddUint32 атомарно прибавляет указанное значение к переменной типа uint32 и возвращает обновленное значение. Первым параметром функция принимает указатель на переменную типа uint32, которую нужно изменить. Вторым параметром передается значение типа uint32, которое нужно прибавить. Операция выполняется как единая неделимая инструкция процессора, что гарантирует корректность при конкурентном доступе.

Синтаксис

atomic.AddUint32(addr *uint32, delta uint32) uint32

Пример

Давайте создадим счетчик, который увеличивается из двух горутин на 1:

package main import ( "fmt" "sync" "sync/atomic" ) func main() { var counter uint32 = 0 var wg sync.WaitGroup for i := 0; i < 2; i++ { wg.Add(1) go func() { defer wg.Done() for j := 0; j < 100; j++ { newVal := atomic.AddUint32(&counter, 1) fmt.Println("New counter value:", newVal) } }() } wg.Wait() fmt.Println("Final counter value:", counter) }

Результат выполнения кода (значения могут быть в разном порядке, но финальное значение всегда будет корректным):

New counter value: 1 New counter value: 3 New counter value: 2 New counter value: 4 ... Final counter value: 200

Пример

Давайте используем функцию atomic.AddUint32 для реализации счетчика с отрицательным приращением:

package main import ( "fmt" "sync" "sync/atomic" ) func main() { var value uint32 = 100 var wg sync.WaitGroup // Уменьшаем значение на 10 for i := 0; i < 5; i++ { wg.Add(1) go func() { defer wg.Done() // Для вычитания используем дополнение до двух newVal := atomic.AddUint32(&value, ^uint32(9)) fmt.Println("New value:", newVal) }() } wg.Wait() fmt.Println("Final value:", value) }

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

New value: 90 New value: 80 New value: 70 New value: 60 New value: 50 Final value: 50

Обратите внимание, что для вычитания из значения типа uint32 используется выражение ^uint32(n-1), где n - число, которое нужно вычесть.

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

  • функцию atomic.AddInt32,
    которая атомарно прибавляет значение к переменной типа int32
  • функцию atomic.AddInt64,
    которая атомарно прибавляет значение к переменной типа int64
  • функцию atomic.AddUint64,
    которая атомарно прибавляет значение к переменной типа uint64
  • механизм sync.Mutex,
    который обеспечивает взаимоисключающую блокировку для безопасного доступа к данным из разных горутин
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить