Функция atomic.SwapInt32
Функция atomic.SwapInt32 выполняет атомарную замену значения переменной типа int32.
В первый параметр мы передаем указатель на переменную, которую нужно изменить,
во второй параметр мы передаем новое значение, которое нужно установить.
Функция возвращает старое значение переменной до замены.
Эта операция выполняется атомарно, что гарантирует безопасность при работе с общей памятью в конкурентных программах.
Синтаксис
atomic.SwapInt32(addr *int32, new int32) (old int32)
Пример
Давайте заменим значение переменной с 10 на 20 и получим старое значение:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var num int32 = 10
old := atomic.SwapInt32(&num, 20)
fmt.Println("old value:", old)
fmt.Println("new value:", num)
}
Результат выполнения кода:
"old value: 10"
"new value: 20"
Пример
Атомарная замена особенно полезна при работе с несколькими горутинами. Давайте выполним замену значения из разных горутин:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter int32 = 0
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go func(val int32) {
defer wg.Done()
old := atomic.SwapInt32(&counter, val)
fmt.Printf("goroutine %d: old=%d, new=%d\n", val, old, counter)
}(int32(i))
}
wg.Wait()
fmt.Println("final counter:", counter)
}
Результат выполнения кода:
"goroutine 5: old=0, new=5"
"goroutine 3: old=5, new=3"
"goroutine 4: old=3, new=4"
"goroutine 1: old=4, new=1"
"goroutine 2: old=1, new=2"
"final counter: 2"
Смотрите также
-
функцию
atomic.SwapInt64,
которая атомарно заменяет значение переменной типа int64 -
функцию
atomic.SwapUint32,
которая атомарно заменяет значение переменной типа uint32 -
функцию
atomic.CompareAndSwapInt32,
которая атомарно сравнивает и заменяет значение -
функцию
atomic.StoreInt32,
которая атомарно сохраняет значение без возврата старого