Go 源碼學習 - sync.atomic 庫

這個包裏的主要功能應該都是底層實現的,不是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

以下是原子包提供的函數:

  1. Swap
  2. CompareAndSwap
  3. Add
  4. Load
  5. 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{}
}

通過調用LoadPointerStorePointer實現值得加載和存儲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章