原代码
func AtomicCounterDemo() {
var count int32
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for j := 0; j < 1000; j++ {
atomic.AddInt32(&count, 1)
}
}()
}
wg.Wait()
fmt.Println("最终计数器的值:", count)
}
在 Go 语言中,atomic.AddInt32 的函数签名如下:
func AddInt32(addr *int32, delta int32) int32
其中第一个参数 addr 是一个指向 int32 类型变量的指针,也就是 *int32。
为什么要加 &
1. count 是一个 int32 类型的变量。
2. &count 表示取 count 变量的内存地址,也就是 count 的指针。
3. 原子操作需要直接操作变量的内存地址,才能保证并发安全。
举例:
var count int32
atomic.AddInt32(&count, 1) // 传入 count 的地址
如果不加 &
,直接写 atomic.AddInt32(count, 1)
,会报错,因为类型不匹配(需要指针,实际传了值)。
总结:
加 & 是为了传递变量的地址(指针),让原子操作函数能直接修改该变量的值,实现并发安全。
来源链接:https://www.cnblogs.com/neural-networker/p/19001860
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END
暂无评论内容