Go 语言

Go 语言教程 Go 语言环境安装 Go 语言结构 Go 语言基础语法 Go 语言数据类型 Go 语言变量 Go 语言常量 Go 语言运算符 Go 语言条件语句 Go 语言 if 语句 Go 语言 if...else 语句 Go 语言 if 语句嵌套 Go 语言 switch 语句 Go 语言 select 语句 Go 语言循环语句 Go 语言 for 循环 Go 语言循环嵌套 Go 语言 break 语句 Go 语言 continue 语句 Go 语言 goto 语句 Go 语言函数 Go 语言函数值传递值 Go 语言函数引用传递值 Go 语言函数作为值 Go 语言函数闭包 Go 语言函数方法 Go 语言变量作用域 Go 语言数组 Go 语言多维数组 Go 语言向函数传递数组 Go 语言指针 Go 语言指针数组 Go 语言指向指针的指针 Go 语言指针作为函数参数 Go 语言结构体 Go 语言切片(Slice) Go 语言范围(Range) Go 语言Map(集合) Go 语言递归函数 Go 语言类型转换 Go 语言接口 Go 错误处理 Go 语言开发工具Go 语言标准库

Go 语言标准库


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"。

Go语言标准库 >>


  • 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位对齐。