任何人都可以展示需要使用此类原子操作的示例。我不明白
之间的区别import "sync/atomic"
...
var sharedA int64
var sharedB *int64
...
// concurent code
tmpVarA := sharedA
tmpVarB := *sharedB
// and
tmpVarA := atomic.LoadInt64(&sharedA)
tmpVarB := atomic.LoadInt64(sharedB)
答案 0 :(得分:4)
它根本没有在包中记录,但通常原子加载和正常值存储不存在原子性,因为CPU操作已经是原子的,但是用于排序。语言规范或CPU指令文档为您提供了一定的保证,如果您使用原子操作,则另一个CPU将看到一个CPU存储的顺序。如果您没有使用适当的(昂贵的)指令,大多数现代CPU都没有这样的保证。
所以在你的例子中(我假设,因为包没有被记录),如果共享变量先由goroutine写入sharedA
,然后是sharedB
,那么在阅读时如果没有原子操作,您可能会看到sharedB
的更改值,仍然是sharedA
的旧值。如果存储或加载需要执行额外的魔术来获得正确的排序,那么在不同的CPU系列上会有所不同,所以通常语言会让你对存储和加载使用原子函数,然后编译器/库知道你的实际CPU是什么需要。
当然,这个包没有记录任何一个,所以在实践中没有区别,因为我们不知道包实际上保证了什么。因此,出于所有实际目的,它是无用的。