golang 中 += 和 ++ 是原子操作吗?
如果不是原子操作, 为什么不设计为原子操作?
像 atomic 里面的一些操作是原子操作, 应该是 CPU 的一个指令就可以的吧?
为什么这种操作, 要单独放到 atomic 里面的 AddInt32 之类的函数里面来进行
谢谢
1
lhx2008 2018-11-04 00:07:43 +08:00 via Android 1
这个问题就类似于:为什么要分 int long dounle,全 double 不好吗。
|
2
helloworld12 OP 了解了, 还是性能问题
|
3
lhx2008 2018-11-04 00:09:20 +08:00 via Android 1
CPU 操作是 CAS 乐观锁+死循环,并不是一条指令,并发上来可能要执行很多次
|
4
catror 2018-11-04 00:12:08 +08:00 via Android 1
原子操作有性能代价的
|
5
helloworld12 OP 再问下, golang 中 cas 的版本号要怎么处理?
|
6
helloworld12 OP 再问下, golang 中 cas 的版本号要怎么处理?
是已经整合到 AddInt32 里面了? |
7
ccpp132 2018-11-04 11:15:40 +08:00 1
原子操作不只是 cas,但是 atomic 的成本也不低的,1 来要放弃 cache,保证数据写入内存。2 来为了同步可能要加入 mem fence,防止 cpu 乱序执行和编译器的错误优化。而且不熟悉的人非常容易用错。建议要么就先充分阅读掌握相关的内容。要么就加锁
|