原子AddUint32溢出
问题描述:
我使用下面的代码,过程中获得唯一的ID:如果计数器值溢出UINT32的限制原子AddUint32溢出
for i := 0; i < 10; i++ {
go func() {
for {
atomic.AddUint32(&counter, 1)
time.Sleep(time.Millisecond)
}
}()
}
会发生什么?
答
值环绕,这是很容易证明:
u := uint32(math.MaxUint32)
fmt.Println(u)
u++
fmt.Println(u)
// or
u = math.MaxUint32
atomic.AddUint32(&u, 1)
fmt.Println(u)
+0
嗨,是的,我发现了我自己。我认为在这种情况下可能会遇到一些瓶颈。不管怎么说,还是要谢谢你!只是想确认... – ArkadyB
请参阅 “整数溢出” 的规格:https://golang.org/ref/spec#Arithmetic_operators – JimB