为了账号安全,请及时绑定邮箱和手机立即绑定

golang 中 uint8 的读写是原子的吗?

golang 中 uint8 的读写是原子的吗?

Go
Smart猫小萌 2021-12-27 15:19:07
和标题一样,uint8 的读写操作是原子的吗?从逻辑上讲,读取和写入 8 位变量显然必须是单个 cpu 指令。但是无论如何,两个内核可以同时从内存中读取和写入,是否可以通过这种方式创建陈旧数据?
查看完整描述

2 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

不能保证对本机类型的访问在任何平台原子上。这就是为什么有sync/atomic. 另请参阅内存模型文档中的建议。


以原子方式设置值的通用方法示例 ( 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)


查看完整回答
反对 回复 2021-12-27
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

不。如果你想要原子操作,你可以使用这个sync/atomic包。

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

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


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 419 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号