go atomic包分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go atomic包分析相关的知识,希望对你有一定的参考价值。

参考技术A atomic包是go中在并发情况下必用到的包,可以基于原子性对数值进行操作,所以经常用来加减锁操作,这个包的注释里面解释了这个包的作用,还有那句著名的 用通信的方式来共享内存,不要用共享内存方式来通信。

// Share memory by communicating;

// don't communicate by sharing memory.

sync/atomic中的几个函数可以对几种简单的类型进行原子操作。这些类型包括int32,int64,uint32,uint64,uintptr,unsafe.Pointer,共6个。这些函数的原子操作共有5种:增或减,比较并交换、载入、存储和交换它们提供了不同的功能,切使用的场景也有区别。

常用的方法有几种

1、增或减

给值增加或减少一个值。

第一个参数是原值,第二个是要增加多少(如果是负数就是减少多少)

2、比较并交换

比较并交换----Compare And Swap 简称CAS 这也是sync进行锁操作的基础,sync mutex 就是基于这个此方法来判断是否获取了锁

第一个参数是要判断的值,第二个参数是旧值,第三个是新值,第一个和第二个值进行判断,如果一样,就用第三个参数新值来进行替换。根据这个判断可以判断锁是否已被占用。

3、读取

原子性的读取一个值

4、写入

与读操作对应的是写入操作,sync/atomic也提供了与原子的值载入函数相对应的原子的值存储函数。这些函数的名称均以“Store”为前缀

5、交换

与CAS不同,交换操作直接赋予新值,不管旧值。返回值是旧值

总结:atomic包适用于并发量大的情况下对值的修改情况,因为是原子操作,可以做计数器或者加锁等功能。下一篇准备对go string包进行一下分析

Go语言,用原子函数atomic避免资源竞争

下一步应该是互斥锁了。

package main

import (
	"fmt"
	"runtime"
	"sync"
	"sync/atomic"
)

var (
	counter int64
	wg sync.WaitGroup
)

func main() {
	wg.Add(2)
	
	fmt.Println("Create Goroutines")
	go incCounter(1)
	go incCounter(2)
	
	fmt.Println("Waiting To Finish")
	wg.Wait()
	
	fmt.Println("Final Counter:", counter)
}

func incCounter(id int) {
	defer wg.Done()
	for count := 0; count < 2; count++ {
		atomic.AddInt64(&counter, 1)
		runtime.Gosched()

	}
}

  技术分享

以上是关于go atomic包分析的主要内容,如果未能解决你的问题,请参考以下文章

Go语言,用原子函数atomic避免资源竞争

Atom插件go-plus的离线安装

Go璇█atomic鍘熷瓙鎿嶄綔

Go 并发编程 — 结构体多字段的原子操作 atomic.Value

Go sync.atomic原子操作的学习

markdown 如何使用Atom和所有的铃声和​​口哨在MacOS上安装功能性Go开发环境。