zoukankan      html  css  js  c++  java
  • 原子操作--sync/atomic的用法

    golang 通过sync/atomic库来支持cpu和操作系统级别的原子操作。但是对要操作类型有如下要求

    • int32, int64,uint32, uint64,uintptr,unsafe包中的Pointer。不过,针对unsafe.Pointer类型,该包并未提供进行原子加法操作的函数

    sync/atomic 提供的原子操作有

    • 加法(add), 比较并交换(compare and swap, 简称CAS),加载(load), 存储(store),交换(swap)

    针对sync/atomic支持的类型,会有注入atomic.AddInt32这样的函数提供支持

    import (
    	"fmt"
      "sync/atomic"
    )
    
    func main() {
      var a uint32 = 10
      atomic.AddUint32(&a, 1)
      fmt.Println(a)
      // uint32需要一个非负整数,uint32(int32(-1)), 会被编译器报错,需要一个中间变量b来绕过
      b := int32(-1)
      atomic.AddUint32(&a, uint32(b))
      fmt.Println(a)
      // ^uint32(n-1), n为要减去的数
      // 整数在计算机以补码形式存在,这里的异或求出来的补码与b的补码相同
      atomic.AddUint32(&a, ^uint32(3-1))
      fmt.Println(a)
    }
    

    上面的代码有几个点需要注意:

    1. 传递给atomic.AddUint32函数的必须是指针类型。同理,unsafe.Pointer也是如此
    2. 对于atomic.AddUint64函数做原子减法,有两种方法,具体看代码

    sync/atomic 比较并交换操作与交换操作的异同:

    • 比较并交换操作即CAS操作,是有条件的交换操作,只有在条件满足的情况下才会进行值的交换
    func main() {
      var a int32 = 0
      go func() {
        for {
          fmt.Println(a)
           // 当a ==  10,就设置 a=0,并返回ture
          if atomic.CompareAndSwapInt32(&a, 10, 0) {
            fmt.Println("The second number has gone to zero.")
            break
          }
          time.Sleep(time.Millisecond * 500)
          }
      }()
      for {
        a++
        if a >10 {
          break
        }
        time.Sleep(time.Millisecond * 600)
      }
    }
    

    sync/automic.Value

    • sync/automic.Value相当于一个容器,可以被用来"原子地"存储和加载任意的值

    atomic.Value使用事项

    • 不用初始化,声明后即可使用。有两个指针方法Store和Load
    • atomic.Value类型属于结构体类型,而结构体属于值类型,因此对该值的赋值,都会产生新的副本。
    • 不能存储nil。
    • 第一个存入的值类型,决定了后续atomic.Value可以存入的值
  • 相关阅读:
    我所理解的MVC
    关于开发文化的思考
    使用纯C语言开始win32 sdk编程
    谈谈编译原理和其在WEB开发中的应用1
    最简单的win32程序(c语言实现)
    关于Javascript的一些心得与记忆
    Cvv.WebUtility 我的MVC框架介绍
    发现了个不错的图片网站
    轻轻松松做开发--目前网站开发的流行原素
    我的模板分析引擎类PHP的.net开发方法标签设计篇
  • 原文地址:https://www.cnblogs.com/linyihai/p/10258324.html
Copyright © 2011-2022 走看看