Concurrency x86上的增量运算符是原子的吗?

Concurrency x86上的增量运算符是原子的吗?,concurrency,thread-safety,go,atomic,Concurrency,Thread Safety,Go,Atomic,以下是一些背景: 我需要一个go例程之间共享的计数器变量,用于类似漏桶的东西。我知道在有效的Go,concurrent部分中有一个漏桶的例子,但是我需要跟踪的数量可能非常大,我觉得使用通道中的元素数量来跟踪它是低效的。因此,我正在考虑在不同的例程之间使用一个共享变量来跟踪数字 我知道,如果没有显式配置,所有go例程都映射到一个线程上。但是,如果我在多核计算机上为程序分配多个线程,增量操作符是原子的吗?不同机器上的不同数据类型(int32,float32等)是否都一样(x86\u 32,x86\u

以下是一些背景:
我需要一个go例程之间共享的计数器变量,用于类似漏桶的东西。我知道在有效的Go,concurrent部分中有一个漏桶的例子,但是我需要跟踪的数量可能非常大,我觉得使用通道中的元素数量来跟踪它是低效的。因此,我正在考虑在不同的例程之间使用一个共享变量来跟踪数字

我知道,如果没有显式配置,所有go例程都映射到一个线程上。但是,如果我在多核计算机上为程序分配多个线程,增量操作符是原子的吗?不同机器上的不同数据类型(
int32
float32
等)是否都一样(
x86\u 32
x86\u 64
arm


更具体地说,如果一个例程中有
counter+=1000
,另一个例程中有
counter-=512
,而这两个例程恰好在两个线程中运行,该怎么办?我需要担心线程安全吗?我应该在
计数器上加锁吗?

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

让我们假设:

import "sync/atomic"
var counter = new(int32)
一个goroutine可以执行
atomic.AddInt32(计数器,1000)
,而另一个goroutine可以执行
atomic.AddInt32(计数器,-512)
,而不使用互斥锁

如果您更愿意使用互斥锁:

import "sync"
var counter int32
var mutex sync.Mutex

func Add(x int32) {
    mutex.Lock()
    defer mutex.Unlock()
    counter += x
}

哇!谢谢我没有注意到有
sync/atomic
。这让事情变得容易多了!