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的值相等,

如果相等,用参数new的新值替换掉addr存储的旧值,否则操作就会被忽略。

交换成功,返回true.

example1

package main

import (
        "fmt"
        "sync/atomic"
)

func main(){

        var value int32

        fmt.Println("origin value:", value)

        swapFlag := atomic.CompareAndSwapInt32(&value, 0, 1)

        if swapFlag {
                fmt.Println("swap, value:", value)
        } else {
                fmt.Println("not swap, value:", value)
        }

}

上面的代码是简单使用举例。

判断value中的值是否为0,如果是,则将1存储到value的地址中;否则,不做任何操作。

output:

origin value: 0

swap, value: 1

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, 0, 1)

        if swapFlag {
                fmt.Println("goroutine name:",name,  ", swap, value:", *value)
        } else {
                fmt.Println("goroutine name:", name, ", not swap, value:", *value)
        }

}

创建两个goroutine,两个goroutine执行相同的流程,同时去更新value。

其中一个会操作成功。

主goroutine等待两个goroutine结束。

output:

origin value: 0

goroutine name: 2 , swap, value: 1

goroutine name: 1 , not swap, value: 1

参考

https://www.kancloud.cn/digest/batu-go/153537

http://ifeve.com/go-concurrency-atomic/

原文地址:https://www.cnblogs.com/lanyangsh/p/10125299.html

时间: 2024-10-07 14:46:29

golang 原子操作函数的相关文章

golang的函数

在golang中, 函数是第一类值(first-class object), 即函数可以赋值与被赋值. 换言之, 函数也可以作为ReceiverType, 定义自己的method. 实例: http.HandleFunc(pattern string, handler func(ResponseWriter, *Request)) 就是使用上述思想实现. type HandlerFunc func(ResponseWriter, *Request) func (f HandlerFunc) Se

Golang理解-函数变量

函数变量 函数作为变量值 函数变量是把函数作为值保存到变量中. 在Golang中,,函数也是一种类型,可以和其他类型一样被保存在变量中.例如: package main // 将函数作为值保存到变量中 import ( "fmt" ) func fire() { fmt.Println("fire") } func main(){ f := fire() // 将变量f声明为func()类型,此时f就被俗称为"回调函数", 此时f的值为nil f

golang(06)函数介绍

原文链接 http://www.limerence2017.com/2019/09/11/golang11/#more 函数简介 函数是编程语言中不可缺少的部分,在golang这门语言中函数是一等公民.也是使用好golang的必备技能.看下golang函数的格式 123 func 函数名(函数参数)返回值类型{ } 一个简单的函数 123 func HelloFunc(str string) string{ return str} 该函数返回传入的字符串,函数调用如下 1 fmt.Println

Golang泛型函数

目前,golang还不支持模板函数(类型参数化),所以看上去不得不为每一种类型都实现一个函数.但是Golang可以利用空接口interface{}和闭包/高阶函数来实现泛型函数. 1 空接口 空接口interface{}是指方法集为空的接口,任何类型的值都可以赋值给空接口.接口相关内容请参见另一篇博客<Golang中的接口> // interface{} func minimum(first interface{}, rest ...interface{}) interface{} {    

Golang tips ----- 函数

1.在函数调用时,Golang没有默认参数值 2.一个函数声明如果没有函数体,表面该函数不是由Golang实现的,这样的声明定义了函数标识符 3.拥有函数名的函数只能在包级语法块中被声明 4.函数值(闭包)属于引用类型并且不可比较 5.在循环中生成的所有函数值共享相同的循环变量,并且需要注意的是,函数值记录的是循环变量的地址,而不是循环变量某一刻的值.如果函数值都在循环结束运行的话,那对于循环变量,每个函数对应的都是相同的值.如下面的代码所示,最后迭代运行函数切片,输出的都将是相同的值5.因为它

[golang note] 函数定义

普通函数定义 √ golang函数基本组成:关键字func.函数名.参数列表.返回值.函数体和返回语句. • 语法如下 func 函数名(参数列表) (返回值列表) { // 函数体 } • 示例如下 package main import "fmt" import "errors" func Add(a int, b int) (ret int, err error) { if a < 0 || b < 0 { // 假定只支持两个非负数字的加法 er

golang中函数类型

今天看Martini文档,其功能列表提到完全兼容http.HandlerFunc接口,就去查阅了Go: net/http的文档,看到type HandlerFunc这部分,顿时蒙圈了.由于之前学习的时候没有关注过function types的知识点,就Google了一些文章,才算是有了个大概的了解. 从golang的官方文档得知function types的解释是这样的. A function type denotes the set of all functions with the same

gcc内置原子操作函数

最近在用户态下突然需要用到原子变量,又不想自己编译boost,思来索去,无意中竟发现gcc还有这一组内置函数. //先做操作,再返回变化后的值 type __sync_fetch_and_add (type *ptr, type value); type __sync_fetch_and_sub (type *ptr, type value); type __sync_fetch_and_or (type *ptr, type value); type __sync_fetch_and_and 

linux无锁化编程--__sync_fetch_and_add系列原子操作函数

linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础. 下面的东西整理自网络.先感谢大家的分享! __sync_fetch_and_add系列的命令,发现这个系列命令讲的最好的一篇文章,英文好的同学可以直接去看原文.Multithreaded simple data type access and atomic variables __sync_fetch_and_add系列一共有十二个函数,有加/减/与/或/异或/等函数的原子性操作函数,__sync_fetc