首页 > 其他 > 详细

原子操作--sync/atomic的用法

时间:2019-01-12 00:56:20      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:补码   fun   println   两种   add   必须   n-1   中间变量   inter   

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的用法

标签:补码   fun   println   两种   add   必须   n-1   中间变量   inter   

原文:https://www.cnblogs.com/linyihai/p/10258324.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 designnerd.net 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号