Atomic

快速 #

Go语言中的 sync/atomic 包提供了一组原子操作函数,用于在多线程或并发环境下执行对共享变量的原子操作。这些操作是原子的,不会受到其他并发操作的干扰,从而避免了竞态条件和数据竞争问题。sync/atomic 包通常用于同步和管理共享资源,以确保线程安全。

Load 操作 读取 #

  • atomic.LoadInt32(&addr int32) int32
    
    • 原子性地读取一个 int32 值。
  • atomic.LoadInt64(&addr int64) int64
    
    • 原子性地读取一个 int64 值。
  • atomic.LoadUint32(&addr uint32) uint32
    
    • 原子性地读取一个 uint32 值。
  • atomic.LoadUint64(&addr uint64) uint64
    
    • 原子性地读取一个 uint64 值。
  • atomic.LoadUintptr(&addr uintptr) uintptr
    
    • 原子性地读取一个 uintptr 值。
  • atomic.LoadPointer(&addr unsafe.Pointer) unsafe.Pointer
    
    • 原子性地读取一个指针值。

Store 操作 设置 #

  • atomic.StoreInt32(&addr int32, val int32)
    
    • 原子性地设置一个 int32 值。
  • atomic.StoreInt64(&addr int64, val int64)
    
    • 原子性地设置一个 int64 值。
  • atomic.StoreUint32(&addr uint32, val uint32)
    
    • 原子性地设置一个 uint32 值。
  • atomic.StoreUint64(&addr uint64, val uint64)
    
    • 原子性地设置一个 uint64 值。
  • atomic.StoreUintptr(&addr uintptr, val uintptr)
    
    • 原子性地设置一个 uintptr 值。
  • atomic.StorePointer(&addr unsafe.Pointer, val unsafe.Pointer)
    
    • 原子性地设置一个指针值。

Add 操作 添加 #

  • atomic.AddInt32(&addr int32, delta int32) int32
    
    • 原子性地将 int32 值增加 delta
  • atomic.AddInt64(&addr int64, delta int64) int64
    
    • 原子性地将 int64 值增加 delta
  • atomic.AddUint32(&addr uint32, delta uint32) uint32
    
    • 原子性地将 uint32 值增加 delta
  • atomic.AddUint64(&addr uint64, delta uint64) uint64
    
    • 原子性地将 uint64 值增加 delta

Compare and Swap 操作 比较加设置 #

  • atomic.CompareAndSwapInt32(&addr int32, old int32, new int32) bool
    
    • 如果 addr 的值为 old,则将其设置为 new,返回 true;否则返回 false
  • atomic.CompareAndSwapInt64(&addr int64, old int64, new int64) bool
    
    • 类似于 int32 版本,但用于 int64
  • atomic.CompareAndSwapUint32(&addr uint32, old uint32, new uint32) bool
    
    • 类似于 int32 版本,但用于 uint32
  • atomic.CompareAndSwapUint64(&addr uint64, old uint64, new uint64) bool
    
    • 类似于 int32 版本,但用于 uint64
  • atomic.CompareAndSwapPointer(&addr unsafe.Pointer, old unsafe.Pointer, new unsafe.Pointer) bool
    
    • 类似于 int32 版本,但用于指针。

Swap 操作 设置 #

  • atomic.SwapInt32(&addr int32, new int32) int32
    
    • 原子性地将 addr 设置为 new,返回旧值。
  • atomic.SwapInt64(&addr int64, new int64) int64
    
    • 类似于 int32 版本,但用于 int64
  • atomic.SwapUint32(&addr uint32, new uint32) uint32
    
    • 类似于 int32 版本,但用于 uint32
  • atomic.SwapUint64(&addr uint64, new uint64) uint64
    
    • 类似于 int32 版本,但用于 uint64
  • atomic.SwapPointer(&addr unsafe.Pointer, new unsafe.Pointer) unsafe.Pointer
    
    • 类似于 int32 版本,但用于指针。

详细 #

storeInt32 原子性设置值 #

atomic.StoreInt32函数来原子性地设置一个32位整数的值。这个函数可以确保在并发操作中的可靠性,避免出现竞争条件。

func main() {
    var num int32 = 10
    // 原子性地设置 num 的值为 20
    atomic.StoreInt32(&num, 20)

    fmt.Println("设置后的数值:", num)
}

LoadInt32原子加载整数 #

sync/atomic 包中的一个函数,用于原子加载一个32位整数。这个函数用于在并发编程中的低级内存管理和同步中,以避免竞争条件。

func main() {
    var num int32 = 10

    // 原子加载 num 的值
    value := atomic.LoadInt32(&num)

    fmt.Println("数值:", value)
}