2011-08-20 71 views
4

在這個例子中,我假設我們在一個至少有兩個物理內核的X86系統上,並且線程#1和#2運行在它自己的CPU內核上(真正的並行性):多線程和一致性模型

[initial state] 
shared_memory_location = 0; 

[thread #1] 
shared_memory_location = 1; 
signal(); 

[thread #2] 
wait_for_signal(); 
print(shared_memory_location); 

shared_memory_location對線程#2的價值是什麼?

這是我對這樣的:它可能是要麼01但X86的一致性模型保證了存儲位置寫入之後的任何讀操作將讀取新的值,而不管這個讀發生在其CPU核心。

X86一致性模型將確保執行第二個線程的第二個物理內核不會從CPU內核專用高速緩存中獲取無效值。 X86使這一點變得更加簡單,但是並不能保證像ARM這樣的其他系統會以這種方式行事。

如果您沒有X86的一致性模型,您將如何確保線程#2在從線程#1發出信號時能夠讀取新值?

......或者更重要的是,你如何將一個值傳給正在以正確方式等待信號的線程?

免責聲明:我可能完全錯誤的X86一致性模型,請糾正我,如果我是!

回答

0

如果signal()wait_for_signal()方法調用內部內存屏障,那麼情況你描述,因爲內存屏障通話不會發生甚至ARM,數據刷新到在主存儲器,而不是私人的核心緩存,即它會將數據刷新到主內存中,所以shared_memory_location將會是「volatile write」,並且它也會將數據刷新到wait_for_signal之後的主內存中,所以讀取shared_memory_location將會是「volatile read」。

+0

我以前聽說過記憶障礙,但你如何使用它們?你什麼是路障?這只是一個編譯器技巧? –

+0

內存屏障或內存圍欄通常用於禁止CPU對指令進行重新排序,它暴露在兩個部分:半圍欄和一個完整的圍欄..這裏描述的確是一個很大的話題,但您可以在內存中找到更具體的細節屏障[here](http://msdn.microsoft.com/en-us/library/ms686355(v = vs.85).aspx)和[here](http://en.wikipedia.org/wiki/Memory_barrier ) –

+0

謝謝,我會讀它們。 –