关于 go 原子性运算问题,想不通,谁来解释下。

2014-10-12 17:01:38 +08:00
 barbery
demo在这里:
https://gist.github.com/Barbery/08973672e132d5edfe44 后面我的评论是部分输出结果



我记得,按照官方的说法,map是unsafe的,为什么int类型也会出现这种情况。。。最最最想不明白的是,为什么调用atomic包的AddInt32都不能保证原子性的问题???
3290 次点击
所在节点    问与答
7 条回复
barbery
2014-10-12 17:02:38 +08:00
额。。。gist链接被转成内嵌脚本了。。。好吧,我贴下部分输出结果,如下:
intNum 100
atomicIntNum 100
mapNum map[count:93]
sliNum [100]

intNum 93
atomicIntNum 99
mapNum map[count:71]
sliNum [100]

intNum 95
atomicIntNum 100
mapNum map[count:76]
sliNum [100]

intNum 100
atomicIntNum 100
mapNum map[count:83]
sliNum [100]
wjchen
2014-10-12 17:08:43 +08:00
atomicIntNum = atomic.AddInt32(&atomicIntNum, 1)这里不需要赋值。
barbery
2014-10-12 18:10:05 +08:00
@wjchen 果然,赞一个,看到文档写着“func AddInt32(addr *int32, delta int32) (new int32)” 返回new int32 以为需要赋值。。。原来是我搞错了~
uuhp2009
2014-10-12 19:27:33 +08:00
@barbery 返回但是不是赋值给你要加的数字
barbery
2014-10-12 20:20:55 +08:00
@wjchen
@uuhp2009
嗯,intNum++为什么不是原子性的呢?
chai2010
2014-10-20 07:25:49 +08:00
@barbery 语言规范并没有定义 `intNum++` 是原子操作, 任何变量的赋值都不是原子操作.
建议先看下Go的内存模型: http://golang.org/ref/mem
barbery
2014-10-20 09:26:25 +08:00
@chai2010 感谢分享!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/138474

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX