是否在golang atomic中对uint8进行读写?

Ozu*_*afa 4 go atomicity uint

在标题中,是关于uint8,atomic的读写操作吗?从逻辑上讲,它必须是单个cpu指令,显然是为8位变量进行读写.但无论如何,两个内核可以同时从内存中读写,是否有可能以这种方式创建过时的数据?

Jim*_*imB 8

不可以sync/atomic.如果您想要原子操作,可以使用该包.

如果你的意思是"即使我忽略Go 内存模型,8bit操作是否会原子化?",那么答案仍然是,可能不是.

如果硬件保证读/写操作的原子性,那么它可能是原子的.但是,这仍然不能保证缓存一致性,也不能保证重新排序操作的编译器优化.你需要以某种方式序列化操作,使用原始Go在"原子"包中提供,并使用"sync"包和通道在goroutines之间进行协调.


nem*_*emo 8

无法保证本机类型的访问在任何平台上都是原子的.这就是原因sync/atomic.另请参阅内存模型文档中的建议.

原子设置值的通用方法示例(Play)

var ax atomic.Value // may be globally accessible

x := uint8(5)

// set atomically
ax.Store(x)

x = ax.Load().(uint8)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)