有没有人能举例说明这种原子操作的用法。我不明白两者之间有什么区别
import "sync/atomic"
...
var sharedA int64
var sharedB *int64
...
// concurent code
tmpVarA := sharedA
tmpVarB := *sharedB
// and
tmpVarA := atomic.LoadInt64(&sharedA)
tmpVarB := atomic.LoadInt64(sharedB)发布于 2015-11-05 18:59:34
它根本没有记录在包中,但正常情况下,原子性加载和存储正常值并不是为了原子性,因为CPU操作已经是原子性的,而是为了排序。语言规范或CPU指令文档为您提供了一定的保证,即如果您使用原子操作,则一个CPU存储将以何种顺序被另一个CPU看到。
所以在你的例子中(我假设,因为这个包没有文档),如果共享变量是由goroutine首先写入sharedA,然后是sharedB,那么在没有原子操作的情况下读取时,你可能会看到sharedB的值发生了变化,而sharedA的值仍然是原来的值。如果存储或加载需要执行额外的魔术来获得正确的排序,那么在不同的CPU系列上就会有所不同,所以通常语言会让你同时使用原子函数来存储和加载,然后编译器/库就会知道你实际需要的CPU是什么。
当然,这个包并没有记录所有这些内容,所以在实践中没有区别,因为我们不知道这个包实际保证了什么。因此,在所有实际目的中,它都是无用的。
https://stackoverflow.com/questions/33542609
复制相似问题