2014-03-04 50 views
2

說有兩個線程,t1和t2。 t1修改全局標誌f1,t2在大約相同的時間修改全局標誌f2。如果t1試圖讀取f2(或t2讀取f1),那麼它會讀取f2(或f1)的舊值嗎?C++ 11中寬鬆內存模型的基本機制是什麼?

這個問題真的不是關於C++ 11的。我只想了解一個多線程程序在緩存一致性方面的行爲以及鬆弛模型如何以及爲什麼會出現並且很有用。

+1

[watch and learn](http://herbsutter.com/2013/02/11/atomic-weapons-the-c-memory-model-and-modern-hardware/) – TemplateRex

+0

你在問這個問題。 「繼此之後」預示着某種形式的同步正在進行。在沒有同步的情況下,如何判斷't1'是否讀取'f2'發生在't2'寫入之前或之後? –

+0

我明白訂單是不確定的。 t1在t2修改之前或之前可以讀取f2。現在說t1在core1上運行時修改f1,t2在兩個處理器上運行在core 2上時修改f2。接下來,假設t1訪問f2,即f1和f2都被修改,儘管在兩個不同內核的高速緩存中。讀取f2會觸發某種一致性強制執行還是可能仍然讀取f2的舊值,因爲它尚未寫入內存? – CppNoob

回答

3

鬆弛排序只保證線程永遠不會觀察到特定內存位置的舊值,而不是它觀察到的最新值。如果t1在問題中提到的特定閱讀之前從未觀察到f2,它可以觀察到曾經寫入f2的任何值。

本身,使用memory_order_relaxed與C++ 11 std::atomic是相當薄弱的。它只是保證讀/寫相對於其他線程是不可分割的:沒有線程會看到部分寫入(撕掉)的值。輕鬆的排序只有在與其他內存操作或讀取 - 修改 - 寫入操作進行交互時纔有用。無論內存順序如何,讀取 - 修改 - 寫入操作保證讀取最近寫入的值。

相關問題