和標題一樣,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)

慕姐8265434
TA貢獻1813條經驗 獲得超2個贊
不。如果你想要原子操作,你可以使用這個sync/atomic
包。
如果您的意思是“即使我忽略 Go內存模型,8 位操作也會是原子的嗎?”,那么答案仍然是,這取決于可能不是。
如果硬件保證讀/寫操作的原子性,那么它可能是原子的。但這仍然不能保證緩存一致性,或重新排序操作的編譯器優化。您需要以某種方式序列化操作,使用 Go 在“atomic”包中提供的原語,并使用“sync”包和通道在 goroutine 之間進行協調。
- 2 回答
- 0 關注
- 364 瀏覽
添加回答
舉報
0/150
提交
取消