2013-08-27 18 views
2

創建在主線程全局變量(C++)和其值設置爲X,則到Y 之後我產生多個線程,並從該變量讀取。 我有保證我會讀Y嗎?正確性

如果沒有,會讀(共享)-mutex保護解決嗎? (即使互斥可以一直採取)

究竟迫使多處理器的高速緩存進行同步?

+0

只要同時沒有寫入變量,從多線程讀取就是安全的。 – user1233963

回答

4

啓動線程引入了隱式內存障礙。

C++ 11保證這在§30.3.1.2構建std::threads

同步:構造 的調用的完成同步與f的副本的調用開始。

其中F是函數由線程執行。另請參閱§1.10,其中的定義與同步(或查看this blog post)。

通俗地說,它是安全的同時讀取來自不同線程的價值,這是保證,他們將所有的閱讀最新的,正確的值。當然,只要沒有人在開始啓動線程後對該變量執行任何寫操作,情況就是如此。在這種情況下,您將需要原子或明確的鎖定(即互斥鎖)。

+1

你知道標準說編譯器必須尊重這個嗎? – OllieB

+1

@OllieB關於構造'std :: thread's的第30.3.1.2節:_Synchronization:調用構造函數的完成與f._副本的調用開始同步。其中f是由線。有關_synchronizes with_的定義,另請參見§1.10。 – ComicSansMS

+0

這應該是你的答案,因爲它是明確的。 – OllieB

0

如果您在之後產生了線索,那麼將Y分配給您的變量,他們確實會看到該值。

會讀(共享)-mutex保護解決呢?

只有在您同時修改變量(不管其他併發操作是讀還是寫)時才需要互斥鎖。如果你永遠不會同時修改你的變量(就像這裏的情況一樣),你不需要互斥體。

究竟迫使多處理器的高速緩存進行同步?

通常,寫入內存位置會使其他處理器上的相應緩存條目無效。當您再次訪問該變量時,如果需要,相應的處理器將重新填充緩存。