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/
>>: Electron - 今晚我想来点 Electron 加 Vue.js
在 Storyboard 上设计画面 接下来我们来在一开始建立的专案上设计画面,首先我们在专案导览器...
还记得系列文的一开始,有先向各位读者介绍在 NiFi 中重要的几个 Componenet,那时候还只...
前置作业-HTML & CSS 使用 Google 查 Weather App 会有很多很多...
半夜的苹果发表会,想起了贾伯斯的那句“Stay Hungry. Stay Foolish” “Yo...
tags: 铁人赛 DevOps EIP EC2 萝卜糕 概述 碎念时间 不论是开发软件硬体,还蛮常...