iT邦幫忙

0

[Golang]同步工具-sync包的原子操作(上)-心智圖總結

  • 分享至 

  • xImage
  •  

1. 原子操作是什麼?
原子操作,操作進行的過程不能被中斷。也就是說,某個值在原子操作的過程中,CPU絕不會再去進行其它針對該值的操作。為了實現這樣的嚴謹,原子操作僅會由一個獨立的CPU指令代表和完成。

2. Go語言對原子操作的支援
A. sync/atomic包中的函數,可以做的原子操作有,加法(add)、比較和交換(compare and swap,簡稱CAS)、加載(load)、儲存(store)、交換(swap)。
B. 可以操作的數據類型: int32、int64、uint32、uint64、uintptr、以及unsafe包中的Pointer。

3. 傳入這些原子操作函數的第一個參數值,對應的都應該是被操作值的指針。
原子操作函數拿到被操作值的指針,才可以定位到儲存該值的內存地址。才能通過底層的指令,準確地操作這個內存地址上的數據。

4. 使用原子加法操作的函數,做原子減法。
程式碼範例:

package main

import (
  "fmt"
  "sync/atomic"
)

func main() {
  num1 := uint32(20)
  fmt.Printf("The number: %d\n", num1)
  num2 := int32(-3)
  atomic.AddUint32(&num1, uint32(num2))
  fmt.Printf("The number: %d\n", num1)
  atomic.AddUint32(&num1, ^uint32(-(-3)-1))
  fmt.Printf("The number: %d\n", num1)
}

https://play.golang.org/p/-KTsL5WXCCS

說明:
^uint32(-N-1),N為負整數表示的差量。

https://ithelp.ithome.com.tw/upload/images/20201125/20131728xh5CfgGgy6.png

參考來源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言