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為負整數表示的差量。
參考來源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/