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

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

  •  
  •   helloworld12 · 2018-11-04 00:03:26 +08:00 · 5246 次点击
    这是一个创建于 2203 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    谢谢

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