[Golang]同步工具-sync包的原子操作(上)-心智图总结

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/


<<:  Electron - 常用 API 解析

>>:  Electron - 今晚我想来点 Electron 加 Vue.js

Day05 UIKit 04 - 在 Storyboard 上设计画面

在 Storyboard 上设计画面 接下来我们来在一开始建立的专案上设计画面,首先我们在专案导览器...

Day5 NiFi - FlowFiles

还记得系列文的一开始,有先向各位读者介绍在 NiFi 中重要的几个 Componenet,那时候还只...

[番外] 来个 Weather App (续)

前置作业-HTML & CSS 使用 Google 查 Weather App 会有很多很多...

卡夫卡的藏书阁【Book3】- Kafka 讯息与主题 Record and Topic

半夜的苹果发表会,想起了贾伯斯的那句“Stay Hungry. Stay Foolish” “Yo...

【Day 10】EC2 x EIP x 萝卜糕实例制作

tags: 铁人赛 DevOps EIP EC2 萝卜糕 概述 碎念时间 不论是开发软件硬体,还蛮常...