這個包裏的主要功能應該都是底層實現的,不是go寫的,先看一下說明文檔。
原子包提供了實用的底層原子內存原語用以實現同步算法。
這些函數需要非常小心才能正確使用。除底層應用這一特殊情況以外,同步最好使用通道或者 sync 包裏的其他工具實現。通過通信來共享內存;不要通過共享內存來通信。
SwapT 函數實現的交換操作,原子等價於:
old = *addr
*addr = new
return old
也就是將一個內存地址的值更新爲新值並將舊值返回
CompareAndSwapT 函數實現的比較交換操作,原子等價於:
if *addr == old{
*addr=new
return true
}
return false
也就是將一個內存地址的值與一箇舊值比較,如果相等就將其更新爲一個新值並返回true,代表原子更新成功,否則返回false代表原子更新失敗。
AddT 函數實現的添加操作,原子等價於:
*addr += dalte
return *addr
LoadT 和 StoreT 實現的加載和儲存操作原子等價於return *addr
和 *addr = val
。
以下是原子包提供的函數:
- Swap
- CompareAndSwap
- Add
- Load
- Store
其中 Add 不支持 ,除此之外,全部的操作都支持以下數據類型:
- int32
- int64
- uint32
- uint64
- uintptr
- unsafe.Pointer
如果要將 x 減去一個有符號負數常量值 c,用AddUint32(&x, ^uint32(c-1))
。
再看一下value.go
Value 結構體爲一個固定類型的值提供原子的加載和存儲。加載Value的零值得到nil。一旦調用存儲函數,Value就不許被複制了。
type Value struct {
v interface{}
}
通過調用LoadPointer
和 StorePointer
實現值得加載和存儲。