如标题所示,是关于uint8,atomic的读写操作吗? 从逻辑上讲,它必须是单个cpu指令,显然是为8位变量进行读写。但无论如何,两个内核可以同时从内存中读写,是否有可能以这种方式创建过时的数据?
答案 0 :(得分:8)
没有。如果您想要原子操作,可以使用sync/atomic
包。
如果你的意思是“即使我忽略了Go memory model会使8位操作成为原子?”,那么答案仍然是,它取决于可能不是。
如果硬件保证读/写操作的原子性,那么它可能是原子的。但是,这仍然不能保证缓存一致性,也不能保证重新排序操作的编译器优化。你需要以某种方式序列化操作,使用原始Go在“原子”包中提供,并使用“sync”包和通道在goroutines之间进行协调。
答案 1 :(得分:8)
无法保证本机类型的访问权限在任何平台上。这就是sync/atomic
的原因。另请参阅the advice in the memory model documentation。
原子设置值(Play)
的通用方法示例var ax atomic.Value // may be globally accessible
x := uint8(5)
// set atomically
ax.Store(x)
x = ax.Load().(uint8)
uint8
(Play)可能更有效的解决方案:
var ax int64 // may be globally accessible
x := uint8(5)
atomic.StoreInt64(&ax, 10)
x = uint8(atomic.LoadInt64(&ax))
fmt.Printf("%T %v\n", x, x)