package atomic

import “sync/atomic”

atomic包提供了底层的原子级内存操作,对于同步算法的实现很有用。

这些函数必须谨慎地保证正确使用。除了某些特殊的底层应用,使用通道或者sync包的函数/类型实现同步更好。

应通过通信来共享内存,而不通过共享内存实现通信。

被SwapT系列函数实现的交换操作,在原子性上等价于:

old = *addr *addr = new return old CompareAndSwapT系列函数实现的比较-交换操作,在原子性上等价于:

if *addr == old { *addr = new return true } return false AddT 系列函数实现加法操作,在原子性上等价于:

*addr += delta return *addr LoadT和StoreT系列函数实现的加载和保持操作,在原子性上等价于:”return *addr”和”*addr = val”。

Index 返回首页

func LoadInt32(addr *int32) (val int32) func LoadInt64(addr *int64) (val int64) func LoadUint32(addr *uint32) (val uint32) func LoadUint64(addr *uint64) (val uint64) func LoadUintptr(addr *uintptr) (val uintptr) func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer) func StoreInt32(addr *int32, val int32) func StoreInt64(addr *int64, val int64) func StoreUint32(addr *uint32, val uint32) func StoreUint64(addr *uint64, val uint64) func StoreUintptr(addr *uintptr, val uintptr) func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer) func AddInt32(addr *int32, delta int32) (new int32) func AddInt64(addr *int64, delta int64) (new int64) func AddUint32(addr *uint32, delta uint32) (new uint32) func AddUint64(addr *uint64, delta uint64) (new uint64) func AddUintptr(addr *uintptr, delta uintptr) (new uintptr) func SwapInt32(addr *int32, new int32) (old int32) func SwapInt64(addr *int64, new int64) (old int64) func SwapUint32(addr *uint32, new uint32) (old uint32) func SwapUint64(addr *uint64, new uint64) (old uint64) func SwapUintptr(addr *uintptr, new uintptr) (old uintptr) func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer) func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool) func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool) func CompareAndSwapUint32(addr *uint32, old, new uint32) (swapped bool) func CompareAndSwapUint64(addr *uint64, old, new uint64) (swapped bool) func CompareAndSwapUintptr(addr *uintptr, old, new uintptr) (swapped bool) func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) (swapped bool) func LoadInt32 func LoadInt32(addr int32) (val int32) LoadInt32原子性的获取addr的值。

func LoadInt64 func LoadInt64(addr int64) (val int64) LoadInt64原子性的获取addr的值。

func LoadUint32 func LoadUint32(addr uint32) (val uint32) LoadUint32原子性的获取addr的值。

func LoadUint64 func LoadUint64(addr uint64) (val uint64) LoadUint64原子性的获取addr的值。

func LoadUintptr func LoadUintptr(addr uintptr) (val uintptr) LoadUintptr原子性的获取addr的值。

func LoadPointer func LoadPointer(addr unsafe.Pointer) (val unsafe.Pointer) LoadPointer原子性的获取addr的值。

func StoreInt32 func StoreInt32(addr int32, val int32) StoreInt32原子性的将val的值保存到addr。

func StoreInt64 func StoreInt64(addr int64, val int64) StoreInt64原子性的将val的值保存到addr。

func StoreUint32 func StoreUint32(addr uint32, val uint32) StoreUint32原子性的将val的值保存到addr。

func StoreUint64 func StoreUint64(addr uint64, val uint64) StoreUint64原子性的将val的值保存到addr。

func StoreUintptr func StoreUintptr(addr uintptr, val uintptr) StoreUintptr原子性的将val的值保存到addr。

func StorePointer func StorePointer(addr unsafe.Pointer, val unsafe.Pointer) StorePointer原子性的将val的值保存到addr。

func AddInt32 func AddInt32(addr int32, delta int32) (new int32) AddInt32原子性的将val的值添加到addr并返回新值。

func AddInt64 func AddInt64(addr int64, delta int64) (new int64) AddInt64原子性的将val的值添加到addr并返回新值。

func AddUint32 func AddUint32(addr uint32, delta uint32) (new uint32) AddUint32原子性的将val的值添加到addr并返回新值。

如要减去一个值c,调用AddUint32(&x, ^uint32(c-1));特别的,让x减1,调用AddUint32(&x, ^uint32(0))。

func AddUint64 func AddUint64(addr uint64, delta uint64) (new uint64) AddUint64原子性的将val的值添加到addr并返回新值。

如要减去一个值c,调用AddUint64(&x, ^uint64(c-1));特别的,让x减1,调用AddUint64(&x, ^uint64(0))。

func AddUintptr func AddUintptr(addr uintptr, delta uintptr) (new uintptr) AddUintptr原子性的将val的值添加到addr并返回新值。

func SwapInt32 func SwapInt32(addr int32, new int32) (old int32) SwapInt32原子性的将新值保存到addr并返回旧值。

func SwapInt64 func SwapInt64(addr int64, new int64) (old int64) SwapInt64原子性的将新值保存到addr并返回旧值。

func SwapUint32 func SwapUint32(addr uint32, new uint32) (old uint32) SwapUint32原子性的将新值保存到addr并返回旧值。

func SwapUint64 func SwapUint64(addr uint64, new uint64) (old uint64) SwapUint64原子性的将新值保存到addr并返回旧值。

func SwapUintptr func SwapUintptr(addr uintptr, new uintptr) (old uintptr) SwapUintptr原子性的将新值保存到addr并返回旧值。

func SwapPointer func SwapPointer(addr unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer) SwapPointer原子性的将新值保存到addr并返回旧值。

func CompareAndSwapInt32 func CompareAndSwapInt32(addr int32, old, new int32) (swapped bool) CompareAndSwapInt32原子性的比较addr和old,如果相同则将new赋值给*addr并返回真。

func CompareAndSwapInt64 func CompareAndSwapInt64(addr int64, old, new int64) (swapped bool) CompareAndSwapInt64原子性的比较addr和old,如果相同则将new赋值给*addr并返回真。

func CompareAndSwapUint32 func CompareAndSwapUint32(addr uint32, old, new uint32) (swapped bool) CompareAndSwapUint32原子性的比较addr和old,如果相同则将new赋值给*addr并返回真。

func CompareAndSwapUint64 func CompareAndSwapUint64(addr uint64, old, new uint64) (swapped bool) CompareAndSwapUint64原子性的比较addr和old,如果相同则将new赋值给*addr并返回真。

func CompareAndSwapUintptr func CompareAndSwapUintptr(addr uintptr, old, new uintptr) (swapped bool) CompareAndSwapUintptr原子性的比较addr和old,如果相同则将new赋值给*addr并返回真。

func CompareAndSwapPointer func CompareAndSwapPointer(addr unsafe.Pointer, old, new unsafe.Pointer) (swapped bool) CompareAndSwapPointer原子性的比较addr和old,如果相同则将new赋值给*addr并返回真。

Bugs ☞ 在x86-32构架芯片上,64位函数使用的指令在Pentium MMX之前是不可用的;在非Linux的ARM芯片上,64位函数使用的指令在ARMv6k core之前是不可用的。不管是ARM又或x86-32芯片,安排原子性访问的64位word的64位对齐都是调用者的责任。可以依靠全局变量或申请的切片/结构体的第一个word来实现64位对齐。