为了账号安全,请及时绑定邮箱和手机立即绑定

是x86上Go的增量运算符吗?

是x86上Go的增量运算符吗?

Go
叮当猫咪 2021-05-21 16:19:50
这里有一些背景:我需要在go例程之间共享一个计数器变量,该变量用于诸如漏斗之类的东西。我知道在有效执行的并发部分中有一个漏斗示例,但是我需要跟踪的数量可能非常大,而且我觉得在通道中使用元素数量来跟踪它效率很低。因此,我正在考虑在不同的例程之间使用共享变量来跟踪数字。我知道没有显式配置,所有go例程都会映射到一个线程上。但是,如果我在多核计算机上为该程序分配了多个线程,则增量运算符是原子的吗?它是所有相同的不同的数据类型(int32,float32,等)在不同的机器(x86_32,x86_64,arm)?更具体地讲,如果我counter += 1000在一个例程中又counter -= 512在另一个例程中,并且两个例程恰好在两个线程中运行,该怎么办?我是否需要担心线程安全性?我可以把门锁上counter吗?
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

不,增量永远不应该被认为是原子的。使用原子加法函数或互斥量。


让我们假设:


import "sync/atomic"

var counter = new(int32)

一个goroutine可以做atomic.AddInt32(counter, 1000)而另一个atomic.AddInt32(counter, -512)无需互斥体。


如果您希望使用互斥锁:


import "sync"

var counter int32

var mutex sync.Mutex


func Add(x int32) {

    mutex.Lock()

    defer mutex.Unlock()

    counter += x

}


查看完整回答
反对 回复 2021-05-24
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信