原子操作--sync/atomic的用法
阿新 • • 發佈:2019-01-12
補碼 fun println 兩種 add 必須 n-1 中間變量 inter
golang 通過sync/atomic庫來支持cpu和操作系統級別的原子操作。但是對要操作類型有如下要求
- int32, int64,uint32, uint64,uintptr,unsafe包中的Pointer。不過,針對unsafe.Pointer類型,該包並未提供進行原子加法操作的函數
sync/atomic 提供的原子操作有
- 加法(add), 比較並交換(compare and swap, 簡稱CAS),加載(load), 存儲(store),交換(swap)
針對sync/atomic支持的類型,會有註入atomic.AddInt32這樣的函數提供支持
import ( "fmt" "sync/atomic" ) func main() { var a uint32 = 10 atomic.AddUint32(&a, 1) fmt.Println(a) // uint32需要一個非負整數,uint32(int32(-1)), 會被編譯器報錯,需要一個中間變量b來繞過 b := int32(-1) atomic.AddUint32(&a, uint32(b)) fmt.Println(a) // ^uint32(n-1), n為要減去的數 // 整數在計算機以補碼形式存在,這裏的異或求出來的補碼與b的補碼相同 atomic.AddUint32(&a, ^uint32(3-1)) fmt.Println(a) }
上面的代碼有幾個點需要註意:
- 傳遞給atomic.AddUint32函數的必須是指針類型。同理,unsafe.Pointer也是如此
- 對於atomic.AddUint64函數做原子減法,有兩種方法,具體看代碼
原子操作--sync/atomic的用法