?
This document uses PHP Chinese website manual Release
import "sync/atomic"
概觀
索引
示例
Package atomic 提供了用于實現(xiàn)同步算法的低級原子內(nèi)存原語。
這些功能需要非常小心才能正確使用。除特殊的低級別應(yīng)用程序外,同步更適合使用頻道或同步軟件包的功能。通過溝通共享內(nèi)存; 不要通過共享內(nèi)存進行通信。
由 SwapT 函數(shù)實現(xiàn)的交換操作是以下原子等值:
old = *addr*addr = newreturn old
由 CompareAndSwapT 函數(shù)實現(xiàn)的比較和交換操作與以下原子等價:
if *addr == old {*addr = newreturn true}return false
由 Add T函數(shù)實現(xiàn)的 add 操作與以下操作相當:
*addr += deltareturn *addr
由 LoadT 和 StoreT 函數(shù)實現(xiàn)的加載和存儲操作是 "return *addr" and "*addr = val" 的原子等價物。
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 CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool)
func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) (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 LoadInt32(addr *int32) (val int32)
func LoadInt64(addr *int64) (val int64)
func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer)
func LoadUint32(addr *uint32) (val uint32)
func LoadUint64(addr *uint64) (val uint64)
func LoadUintptr(addr *uintptr) (val uintptr)
func StoreInt32(addr *int32, val int32)
func StoreInt64(addr *int64, val int64)
func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer)
func StoreUint32(addr *uint32, val uint32)
func StoreUint64(addr *uint64, val uint64)
func StoreUintptr(addr *uintptr, val uintptr)
func SwapInt32(addr *int32, new int32) (old int32)
func SwapInt64(addr *int64, new int64) (old int64)
func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer)
func SwapUint32(addr *uint32, new uint32) (old uint32)
func SwapUint64(addr *uint64, new uint64) (old uint64)
func SwapUintptr(addr *uintptr, new uintptr) (old uintptr)
type Value
func (v *Value) Load() (x interface{})
func (v *Value) Store(x interface{})
錯誤
Value (Config) Value (ReadMostly)
doc.go value.go
func AddInt32(addr *int32, delta int32) (new int32)
AddInt32 自動地將增量添加到 * addr 并返回新值。
func AddInt64(addr *int64, delta int64) (new int64)
AddInt64 自動地將增量添加到 * addr 并返回新值。
func AddUint32(addr *uint32, delta uint32) (new uint32)
AddUint32 自動地將增量添加到 * addr 并返回新值。要從 x 中減去一個帶符號的正常數(shù)值 c ,請執(zhí)行 AddUint32(&x, ^uint32(c-1))。特別是,要減少 x ,請執(zhí)行 AddUint32(&x, ^uint32(0)) 。
func AddUint64(addr *uint64, delta uint64) (new uint64)
AddUint64 自動地將增量添加到 * addr 并返回新值。要從 x 中減去一個帶符號的正常數(shù)值 c ,請執(zhí)行 AddUint64(&x, ^uint64(c-1))。特別是,要減少 x ,請執(zhí)行 AddUint64(&x, ^uint64(0)) 。
func AddUintptr(addr *uintptr, delta uintptr) (new uintptr)
AddUintptr 自動向 delta addr 添加 delta 并返回新值。
func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
CompareAndSwapInt32 為 int32 值執(zhí)行比較和交換操作。
func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool)
CompareAndSwapInt64 為 int64 值執(zhí)行比較和交換操作。
func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) (swapped bool)
CompareAndSwapPointer 對不安全的指針值執(zhí)行比較和交換操作。
func CompareAndSwapUint32(addr *uint32, old, new uint32) (swapped bool)
CompareAndSwapUint32 為 uint32 值執(zhí)行比較和交換操作。
func CompareAndSwapUint64(addr *uint64, old, new uint64) (swapped bool)
CompareAndSwapUint64 為 uint64 值執(zhí)行比較和交換操作。
func CompareAndSwapUintptr(addr *uintptr, old, new uintptr) (swapped bool)
CompareAndSwapUintptr 為 uintptr 值執(zhí)行比較和交換操作。
func LoadInt32(addr *int32) (val int32)
LoadInt32 自動加載 * addr 。
func LoadInt64(addr *int64) (val int64)
LoadInt64 自動加載 * addr 。
func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer)
LoadPointer atomically loads *addr.
func LoadUint32(addr *uint32) (val uint32)
LoadUint32 自動加載 * addr 。
func LoadUint64(addr *uint64) (val uint64)
LoadUint64 自動地加載 * addr 。
func LoadUintptr(addr *uintptr) (val uintptr)
LoadUintptr 自動加載 * addr 。
func StoreInt32(addr *int32, val int32)
StoreInt32 自動地將 val 存儲到 * addr 中。
func StoreInt64(addr *int64, val int64)
StoreInt64 自動地將 val 存儲到 * addr 中。
func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer)
StorePointer 自動地將 val 存儲到 * addr 中。
func StoreUint32(addr *uint32, val uint32)
StoreUint32 自動地將 val 存儲到 * addr 中。
func StoreUint64(addr *uint64, val uint64)
StoreUint64 自動地將 val 存儲到 * addr 中。
func StoreUintptr(addr *uintptr, val uintptr)
StoreUintptr 自動將 val 存儲到 * addr 中。
func SwapInt32(addr *int32, new int32) (old int32)
SwapInt32 將自動地新成員存儲到 * addr 并返回以前的 * addr 值。
func SwapInt64(addr *int64, new int64) (old int64)
SwapInt64 自動地將新的值存儲到 * addr 并返回前一個 * addr 值。
func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer)
SwapPointer 自動地將新的值存儲到 * addr 并返回以前的 * addr 值。
func SwapUint32(addr *uint32, new uint32) (old uint32)
SwapUint32 自動地將新的值存儲到 * addr 并返回前一個 * addr 值。
func SwapUint64(addr *uint64, new uint64) (old uint64)
SwapUint64 自動地將新的值存儲到 * addr 中,并返回以前的 * addr 值。
func SwapUintptr(addr *uintptr, new uintptr) (old uintptr)
SwapUintptr 自動地將新值存儲到 * addr 中,并返回前一個 * addr 值。
值提供了一個自動加載和一個一致的類型值的存儲。Value 的零值從 Load 返回 nil 。一旦 Store 被調(diào)用,Value 不能被復制。
首次使用后不得復制 Value 。
type Value struct { // contains filtered or unexported fields}
以下示例顯示如何使用 Value 進行周期性程序配置更新以及將更改傳播到工作程序。
編碼:
var config Value // holds current server configuration// Create initial config value and store into config.config.Store(loadConfig())go func() { // Reload config every 10 seconds // and update config value with the new version. for { time.Sleep(10 * time.Second) config.Store(loadConfig()) }}()// Create worker goroutines that handle incoming requests// using the latest config value.for i := 0; i < 10; i++ { go func() { for r := range requests() { c := config.Load() // Handle request r using config c. _, _ = r, c } }()}
以下示例說明如何使用寫入時復制習慣用法維護可擴展的經(jīng)常讀取但不經(jīng)常更新的數(shù)據(jù)結(jié)構(gòu)。
編碼:
type Map map[string]stringvar m Value m.Store(make(Map))var mu sync.Mutex // used only by writers// read function can be used to read the data without further synchronizationread := func(key string) (val string) { m1 := m.Load().(Map) return m1[key]}// insert function can be used to update the data without further synchronizationinsert := func(key, val string) { mu.Lock() // synchronize with other potential writers defer mu.Unlock() m1 := m.Load().(Map) // load current value of the data structure m2 := make(Map) // create a new value for k, v := range m1 { m2[k] = v // copy all data from the current object to the new one } m2[key] = val // do the update that we need m.Store(m2) // atomically replace the current object with the new one // At this point all new readers start working with the new version. // The old version will be garbage collected once the existing readers // (if any) are done with it.}_, _ = read, insert
func (v *Value) Load() (x interface{})
Load 返回最近的存儲設(shè)置的值。如果此值沒有存儲調(diào)用,則返回 nil 。
func (v *Value) Store(x interface{})
Store 將 Value 的值設(shè)置為 x 。對于給定值的所有對 Store的調(diào)用都必須使用相同具體類型的值。存儲不一致的類型恐慌,就像 Store(nil) 一樣。
? 在x86-32上,64位函數(shù)使用 Pentium MMX 之前不可用的指令。
在非 Linux ARM 上,64位函數(shù)使用 ARMv6k 內(nèi)核之前不可用的指令。
在 ARM 和 x86-32 上,調(diào)用者都有責任安排自動訪問64位字的64位對齊方式。變量或分配的結(jié)構(gòu),數(shù)組或片中的第一個字可以依賴于64位對齊。