在標題中,是關於uint8的原子讀寫操作嗎? 從邏輯上講,它必須是一個單獨的cpu指令,顯然要讀寫一個8位變量。但無論如何,兩個內核可以同時讀寫內存,是否有可能通過這種方式創建陳舊的數據?在golang原子中是否爲uint8讀寫?
回答
不能保證原生類型的訪問在任何平臺原子上。這就是爲什麼有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)
哦,甜蜜,我很聰明:)。感謝您的答案,我沒有意識到我可以使用atomic.Value,並且預定義的方法對我無效。 –
雖然,你知道這個atomic.Value是否僅僅是一個鎖底系統嗎?因爲能夠使任何數據類型原子似乎不可能在CPU水平:) –
@OzumSafa:您可以加載和存儲任何「原子」(間接)通過使用指針。 'atomic.Value'稍微複雜一些,因爲它使用了'interface {}'這兩個單詞,但它是一個概念。 – JimB
否。如果要執行原子操作,可以使用sync/atomic
軟件包。
如果您的意思是「即使我忽略了Go memory model?8bit操作是原子的嗎?」,那麼答案仍然是,
它可能不是
。
如果硬件保證讀/寫操作的原子性,那麼它可能是原子的。但是,這仍然不能保證緩存一致性,或編譯器優化重新排序操作。您需要以某種方式對操作進行序列化,Go提供的原語在「原子」包中,並使用「sync」包和通道在goroutine之間進行協調。
- 1. BOOL是否在Objective C中讀/寫原子?
- 2. 是否寫入SOCK_SEQPACKET原子?
- 3. 是對golang中的原子指針值的讀取或寫入操作?
- 4. SPLFileObject是否爲原子?
- 5. 是否爲WriteFile原子?
- 6. 從pro-pro會話中讀取/寫入對象是否是原子操作?
- 7. 在GoLang中將字節數組「[] uint8」轉換爲float64
- 8. DRF PrimaryRelatedField在讀寫時是否爲NestedSerializer?
- 9. golang(* interface {})(nil)是否爲零?
- 10. 寫入管讀數到golang
- 11. 它是讀/寫數組中的元素的原子操作嗎?
- 12. 在x86上,bool讀/寫操作可以不是原子嗎?
- 13. 是否是imageStore原子?
- 14. MGET是否是原子?
- 15. C#BinaryReader閱讀uint8
- 16. Azure Put Blob操作是否爲原子?
- 17. 對象構造是否爲原子?
- 18. 內聯函數是否爲原子?
- 19. JPA鎖定是否被視爲原子?
- 20. (非原子,讀寫,保留)和(非原子,強)ARC
- 21. 原子讀取然後用寫的std ::原子
- 22. 如何確保原子讀取和原子寫入?
- 23. Django:原子DateTimeField讀取和寫入
- 24. 原子讀/寫值的靜態斷言
- 25. 原子讀取和寫入訪問
- 26. 是否在MongoDB GridFS中爲CRUD操作維護原子性?
- 27. Subversion是否提交原子?
- 28. cookie在瀏覽器中的讀寫原子
- 29. 如何在java中提供2個變量的原子讀/寫?
- 30. 在Linux內核中讀取和寫入原子操作實現
強制性:https://software.intel.com/en-us/blogs/2013/01/06/benign-data-races-what-could-wrong-wrong – JimB
@JimB謝謝 –
OP是否擔心8位可能無法發送到RAM或從RAM發送或緩存行或核心註冊商呃連貫一致?或者,一旦讀取數據,由於另一個核心的寫入,數據可能會陳舊?最後一句問到陳舊的數據,是的,如果另一個goroutine有邏輯寫入該8位位置,數據可能會在一個核心或一個goroutine中變得陳舊。地鼠喜歡使用協程和通道。如果您尚未看到「不通過共享內存進行通信,而是通過通信共享內存」的建議,請參閱https://blog.golang.org/share-memory-by-communicating。 – WeakPointer