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

2018-11-04 00:03:26 +08:00
 helloworld12

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

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

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

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

谢谢

5243 次点击
所在节点    问与答
7 条回复
lhx2008
2018-11-04 00:07:43 +08:00
这个问题就类似于:为什么要分 int long dounle,全 double 不好吗。
helloworld12
2018-11-04 00:08:51 +08:00
了解了, 还是性能问题
lhx2008
2018-11-04 00:09:20 +08:00
CPU 操作是 CAS 乐观锁+死循环,并不是一条指令,并发上来可能要执行很多次
catror
2018-11-04 00:12:08 +08:00
原子操作有性能代价的
helloworld12
2018-11-04 00:23:44 +08:00
再问下, golang 中 cas 的版本号要怎么处理?
helloworld12
2018-11-04 00:25:27 +08:00
再问下, golang 中 cas 的版本号要怎么处理?
是已经整合到 AddInt32 里面了?
ccpp132
2018-11-04 11:15:40 +08:00
原子操作不只是 cas,但是 atomic 的成本也不低的,1 来要放弃 cache,保证数据写入内存。2 来为了同步可能要加入 mem fence,防止 cpu 乱序执行和编译器的错误优化。而且不熟悉的人非常容易用错。建议要么就先充分阅读掌握相关的内容。要么就加锁

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

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

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

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

© 2021 V2EX