V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
barbery
8.15D
0.39D
V2EX  ›  问与答

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

  •  
  •   barbery · Oct 12, 2014 · 3705 views
    This topic created in 4214 days ago, the information mentioned may be changed or developed.
    demo在这里:
    后面我的评论是部分输出结果



    我记得,按照官方的说法,map是unsafe的,为什么int类型也会出现这种情况。。。最最最想不明白的是,为什么调用atomic包的AddInt32都不能保证原子性的问题???
    7 replies    2014-10-20 09:26:25 +08:00
    barbery
        1
    barbery  
    OP
       Oct 12, 2014
    额。。。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  
       Oct 12, 2014   ❤️ 1
    atomicIntNum = atomic.AddInt32(&atomicIntNum, 1)这里不需要赋值。
    barbery
        3
    barbery  
    OP
       Oct 12, 2014   ❤️ 1
    @wjchen 果然,赞一个,看到文档写着“func AddInt32(addr *int32, delta int32) (new int32)” 返回new int32 以为需要赋值。。。原来是我搞错了~
    uuhp2009
        4
    uuhp2009  
       Oct 12, 2014
    @barbery 返回但是不是赋值给你要加的数字
    barbery
        5
    barbery  
    OP
       Oct 12, 2014
    @wjchen
    @uuhp2009
    嗯,intNum++为什么不是原子性的呢?
    chai2010
        6
    chai2010  
       Oct 20, 2014   ❤️ 1
    @barbery 语言规范并没有定义 `intNum++` 是原子操作, 任何变量的赋值都不是原子操作.
    建议先看下Go的内存模型: http://golang.org/ref/mem
    barbery
        7
    barbery  
    OP
       Oct 20, 2014
    @chai2010 感谢分享!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5624 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 08:36 · PVG 16:36 · LAX 01:36 · JFK 04:36
    ♥ Do have faith in what you're doing.