V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
barbery
V2EX  ›  问与答

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

  •  
  •   barbery · 2014-10-12 17:01:38 +08:00 · 3358 次点击
    这是一个创建于 3703 天前的主题,其中的信息可能已经有所发展或是发生改变。
    demo在这里:
    后面我的评论是部分输出结果



    我记得,按照官方的说法,map是unsafe的,为什么int类型也会出现这种情况。。。最最最想不明白的是,为什么调用atomic包的AddInt32都不能保证原子性的问题???
    7 条回复    2014-10-20 09:26:25 +08:00
    barbery
        1
    barbery  
    OP
       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
        2
    wjchen  
       2014-10-12 17:08:43 +08:00   ❤️ 1
    atomicIntNum = atomic.AddInt32(&atomicIntNum, 1)这里不需要赋值。
    barbery
        3
    barbery  
    OP
       2014-10-12 18:10:05 +08:00   ❤️ 1
    @wjchen 果然,赞一个,看到文档写着“func AddInt32(addr *int32, delta int32) (new int32)” 返回new int32 以为需要赋值。。。原来是我搞错了~
    uuhp2009
        4
    uuhp2009  
       2014-10-12 19:27:33 +08:00
    @barbery 返回但是不是赋值给你要加的数字
    barbery
        5
    barbery  
    OP
       2014-10-12 20:20:55 +08:00
    @wjchen
    @uuhp2009
    嗯,intNum++为什么不是原子性的呢?
    chai2010
        6
    chai2010  
       2014-10-20 07:25:49 +08:00   ❤️ 1
    @barbery 语言规范并没有定义 `intNum++` 是原子操作, 任何变量的赋值都不是原子操作.
    建议先看下Go的内存模型: http://golang.org/ref/mem
    barbery
        7
    barbery  
    OP
       2014-10-20 09:26:25 +08:00
    @chai2010 感谢分享!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2780 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 11:44 · PVG 19:44 · LAX 03:44 · JFK 06:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.