Go语言中如何进行原子增(减)值操作?老男孩GO程序开发课程
老男孩IT教育
行业新闻
2021年11月22日 17:18
sync/atomic 库提供了原子操作的支持,原子操作直接有底层CPU硬件支持,因而一般要比基于操作系统API的锁方式效率高些。本文对 sync/atomic 中的基本操作进行一个简单的介绍。
sync/atomic 库提供了原子操作的支持,原子操作直接有底层CPU硬件支持,因而一般要比基于操作系统API的锁方式效率高些。本文对 sync/atomic 中的基本操作进行一个简单的介绍。
原子增、减值操作
用于对变量值进行原子增操作,并返回增加后的值。
第一个参数值必须是一个指针类型的值,以便施加特殊的CPU指令。
第二个参数值的类型和第一个被操作值的类型总是相同的。
package main
import(
"fmt"
"sync"
"sync/atomic"
)
func main(){
var sum uint32 = 100
// var sum int32 = 100
var wg sync.WaitGroup
for i := 0; i < 50; i++ {
wg.Add(1)
go func() {
defer wg.Done()
//sum += 1 //1
atomic.AddUint32(&sum, 1) //2
// atomic.AddInt32(&sum, -1) //2
}()
}
wg.Wait()
fmt.Println(sum)
}
结果比较:
通过对比//1与//2的结果,可以很清楚的看到原子操作起到的作用。
使用//1时,可以看到sum的值是不定的,取决于sum的同步访问情况;
使用//2时,结果是确定而且正确的,同一时间只有一个goroutine修改sum。
函数原型:
atomic.AddUint32(addr *uint32, delta uint32) uint32
atomic.AddUint64(addr *uint64, delta uint64) uint64
atomic.AddInt32(addr *int32, delta int32) int32
atomic.AddInt64(addr *int64, delta int64) int64
atomic.AddUintptr(addr *uintptr, delta uintptr) uintptr
想要学习GO程序开发课程,推荐老男孩IT教育!我们的GO语言课程学习周期为4-6个月,班型有周末班、网络班,学员可以根据自己的实际情况选择适合的班型。
推荐阅读:
本文经授权发布,不代表老男孩教育立场。如若转载请联系原作者。