在golang atomic中读取和写入uint8吗?

在golang atomic中读取和写入uint8吗?,go,atomicity,uint,Go,Atomicity,Uint,如标题所示,关于uint8的读写操作是原子的吗? 从逻辑上讲,8位变量的读写显然必须是单cpu指令。但在任何情况下,两个内核都可以同时从内存中读写数据,这样是否可以创建过时数据?否。如果需要原子操作,可以使用该软件包 如果你的意思是“即使我忽略了Go,8位操作也是原子的吗?”,那么答案仍然是,这取决于可能不是 如果硬件保证读/写操作的原子性,那么它可能是原子的。但这仍然不能保证缓存一致性,也不能保证重新排序操作的编译器优化。您需要以某种方式序列化操作,使用Go在“原子”包中提供的原语,并使用“同

如标题所示,关于uint8的读写操作是原子的吗?
从逻辑上讲,8位变量的读写显然必须是单cpu指令。但在任何情况下,两个内核都可以同时从内存中读写数据,这样是否可以创建过时数据?

否。如果需要原子操作,可以使用该软件包

如果你的意思是“即使我忽略了Go,8位操作也是原子的吗?”,那么答案仍然是,这取决于可能不是


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

不能保证对本机类型的访问是在任何原子平台上进行的。这就是为什么会有。另见

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

对于
uint8
(),可能是更有效的解决方案:


强制性:OP是否担心8位可能无法连贯地发送到RAM或缓存线或核心寄存器或从RAM或缓存线或核心寄存器发送8位?或者,数据一旦被读取,就会因为另一个内核的写入而过时?最后一句询问过时数据,是的,如果另一个goroutine具有写入该8位位置的逻辑,则一个内核或一个goroutine中的数据可能会过时。地鼠喜欢使用协同路由和通道。如果您还没有看到建议“不要通过共享内存进行通信,而是通过通信来共享内存”,请参阅。@WeakPointer我看到了。我已经阅读了所有的文件。在我的例子中,我被要求使用锁,但是我更倾向于通过原子变量来避免使用锁,以获得更干净的代码。那么,这是说8位数据,即使有一个核心,它也会过时吗?@OzumSafa:这取决于你所说的“过时”是什么意思。如果您希望goroutine之间的可见性,除非您在写入和读取值之间建立关系,否则无法保证。原子操作保证将整个值读写到内存中,但只有锁和通道才能创建“之前发生”顺序,以确保goroutine之间的读写是同步的。哦,太好了,我太聪明了:)。谢谢你的回答,我没有意识到我可以使用atomic.Value,而预定义的方法对我不起作用。尽管如此,你知道这个atomic.Value下面是否只是一个锁系统吗?因为在cpu级别,使任何数据类型原子化似乎是不可能的:)@OzumSafa:您可以使用指针“原子地”(间接地)加载和存储任何内容
atomic.Value
稍微复杂一点,因为它在
接口{}
中使用了两个单词,但这是相同的概念。@JimB我将查看源代码:)谢谢JimB
var ax atomic.Value // may be globally accessible

x := uint8(5)

// set atomically
ax.Store(x)

x = ax.Load().(uint8)
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)