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

golang 中 += 和 ++ 是原子操作吗?

  •  
  •   helloworld12 · Nov 4, 2018 · 5745 views
    This topic created in 2739 days ago, the information mentioned may be changed or developed.

    golang 中 += 和 ++ 是原子操作吗?

    如果不是原子操作, 为什么不设计为原子操作?

    像 atomic 里面的一些操作是原子操作, 应该是 CPU 的一个指令就可以的吧?

    为什么这种操作, 要单独放到 atomic 里面的 AddInt32 之类的函数里面来进行

    谢谢

    7 replies    2018-11-04 11:15:40 +08:00
    lhx2008
        1
    lhx2008  
       Nov 4, 2018 via Android   ❤️ 1
    这个问题就类似于:为什么要分 int long dounle,全 double 不好吗。
    helloworld12
        2
    helloworld12  
    OP
       Nov 4, 2018
    了解了, 还是性能问题
    lhx2008
        3
    lhx2008  
       Nov 4, 2018 via Android   ❤️ 1
    CPU 操作是 CAS 乐观锁+死循环,并不是一条指令,并发上来可能要执行很多次
    catror
        4
    catror  
       Nov 4, 2018 via Android   ❤️ 1
    原子操作有性能代价的
    helloworld12
        5
    helloworld12  
    OP
       Nov 4, 2018
    再问下, golang 中 cas 的版本号要怎么处理?
    helloworld12
        6
    helloworld12  
    OP
       Nov 4, 2018
    再问下, golang 中 cas 的版本号要怎么处理?
    是已经整合到 AddInt32 里面了?
    ccpp132
        7
    ccpp132  
       Nov 4, 2018   ❤️ 1
    原子操作不只是 cas,但是 atomic 的成本也不低的,1 来要放弃 cache,保证数据写入内存。2 来为了同步可能要加入 mem fence,防止 cpu 乱序执行和编译器的错误优化。而且不熟悉的人非常容易用错。建议要么就先充分阅读掌握相关的内容。要么就加锁
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   858 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 19:07 · PVG 03:07 · LAX 12:07 · JFK 15:07
    ♥ Do have faith in what you're doing.