首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用golang原子LoadInt32/StoreInt32 (64)

使用golang原子LoadInt32/StoreInt32 (64)
EN

Stack Overflow用户
提问于 2015-11-05 18:47:32
回答 1查看 2K关注 0票数 5

有没有人能举例说明这种原子操作的用法。我不明白两者之间有什么区别

代码语言:javascript
复制
import "sync/atomic"

...
var sharedA int64
var sharedB *int64
...
// concurent code
tmpVarA := sharedA
tmpVarB := *sharedB
// and
tmpVarA := atomic.LoadInt64(&sharedA)
tmpVarB := atomic.LoadInt64(sharedB)
EN

回答 1

Stack Overflow用户

发布于 2015-11-05 18:59:34

它根本没有记录在包中,但正常情况下,原子性加载和存储正常值并不是为了原子性,因为CPU操作已经是原子性的,而是为了排序。语言规范或CPU指令文档为您提供了一定的保证,即如果您使用原子操作,则一个CPU存储将以何种顺序被另一个CPU看到。

所以在你的例子中(我假设,因为这个包没有文档),如果共享变量是由goroutine首先写入sharedA,然后是sharedB,那么在没有原子操作的情况下读取时,你可能会看到sharedB的值发生了变化,而sharedA的值仍然是原来的值。如果存储或加载需要执行额外的魔术来获得正确的排序,那么在不同的CPU系列上就会有所不同,所以通常语言会让你同时使用原子函数来存储和加载,然后编译器/库就会知道你实际需要的CPU是什么。

当然,这个包并没有记录所有这些内容,所以在实践中没有区别,因为我们不知道这个包实际保证了什么。因此,在所有实际目的中,它都是无用的。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33542609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档