golang 原子操作函数
golang中的原子操作在sync/atomic package中。 下文以比较和交换操作函数为例,介绍其使用。 CompareAndSwapInt32比较和交换操作是原子性的。 // CompareAndSwapInt32 executes the compare-and-swap operation for an int32 value. func CompareAndSwapInt32(addr *int32,old,new int32) (swapped bool) 判断参数addr指向的值是否与参数old的值相等, 交换成功,返回true. example1package main import ( "fmt" "sync/atomic" ) func main(){ var value int32 fmt.Println("origin value:",value) swapFlag := atomic.CompareAndSwapInt32(&value,1) if swapFlag { fmt.Println("swap,value:",value) } else { fmt.Println("not swap,value) } } 上面的代码是简单使用举例。 output:
examaple2下面例子中,有两个goroutine去更新同一地址存储的值,只有一个会操作成功。 package main import ( "fmt" "sync/atomic" "time" ) func main(){ var value int32 fmt.Println("origin value:",value) go entry("1",&value) go entry("2",&value) time.Sleep(time.Second) } func entry(name string,value *int32) { swapFlag := atomic.CompareAndSwapInt32(value,1) if swapFlag { fmt.Println("goroutine name:",name,",swap,*value) } else { fmt.Println("goroutine name:",not swap,*value) } } 创建两个goroutine,两个goroutine执行相同的流程,同时去更新value。 主goroutine等待两个goroutine结束。 output:
参考https://www.kancloud.cn/digest/batu-go/153537 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |