在這個例子中,我假設我們在一個至少有兩個物理內核的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的價值是什麼?
這是我對這樣的:它可能是要麼0
或1
但X86的一致性模型保證了存儲位置寫入之後的任何讀操作將讀取新的值,而不管這個讀發生在其CPU核心。
X86一致性模型將確保執行第二個線程的第二個物理內核不會從CPU內核專用高速緩存中獲取無效值。 X86使這一點變得更加簡單,但是並不能保證像ARM這樣的其他系統會以這種方式行事。
如果您沒有X86的一致性模型,您將如何確保線程#2在從線程#1發出信號時能夠讀取新值?
......或者更重要的是,你如何將一個值傳給正在以正確方式等待信號的線程?
免責聲明:我可能完全錯誤的X86一致性模型,請糾正我,如果我是!
我以前聽說過記憶障礙,但你如何使用它們?你什麼是路障?這只是一個編譯器技巧? –
內存屏障或內存圍欄通常用於禁止CPU對指令進行重新排序,它暴露在兩個部分:半圍欄和一個完整的圍欄..這裏描述的確是一個很大的話題,但您可以在內存中找到更具體的細節屏障[here](http://msdn.microsoft.com/en-us/library/ms686355(v = vs.85).aspx)和[here](http://en.wikipedia.org/wiki/Memory_barrier ) –
謝謝,我會讀它們。 –