2016-03-21 40 views
3

在標題中,是關於uint8的原子讀寫操作嗎? 從邏輯上講,它必須是一個單獨的cpu指令,顯然要讀寫一個8位變量。但無論如何,兩個內核可以同時讀寫內存,是否有可能通過這種方式創建陳舊的數據?在golang原子中是否爲uint8讀寫?

+0

強制性:https://software.intel.com/en-us/blogs/2013/01/06/benign-data-races-what-c​​ould-wrong-wrong – JimB

+0

@JimB謝謝 –

+0

OP是否擔心8位可能無法發送到RAM或從RAM發送或緩存行或核心註冊商呃連貫一致?或者,一旦讀取數據,由於另一個核心的寫入,數據可能會陳舊?最後一句問到陳舊的數據,是的,如果另一個goroutine有邏輯寫入該8位位置,數據可能會在一個核心或一個goroutine中變得陳舊。地鼠喜歡使用協程和通道。如果您尚未看到「不通過共享內存進行通信,而是通過通信共享內存」的建議,請參閱https://blog.golang.org/share-memory-by-communicating。 – WeakPointer

回答

7

不能保證原生類型的訪問在任何平臺原子上。這就是爲什麼有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) 
+0

哦,甜蜜,我很聰明:)。感謝您的答案,我沒有意識到我可以使用atomic.Value,並且預定義的方法對我無效。 –

+0

雖然,你知道這個atomic.Value是否僅僅是一個鎖底系統嗎?因爲能夠使任何數據類型原子似乎不可能在CPU水平:) –

+1

@OzumSafa:您可以加載和存儲任何「原子」(間接)通過使用指針。 'atomic.Value'稍微複雜一些,因爲它使用了'interface {}'這兩個單詞,但它是一個概念。 – JimB

8

否。如果要執行原子操作,可以使用sync/atomic軟件包。

如果您的意思是「即使我忽略了Go memory model?8bit操作是原子的嗎?」,那麼答案仍然是, 它可能不是

如果硬件保證讀/寫操作的原子性,那麼它可能是原子的。但是,這仍然不能保證緩存一致性,或編譯器優化重新排序操作。您需要以某種方式對操作進行序列化,Go提供的原語在「原子」包中,並使用「sync」包和通道在goroutine之間進行協調。