2011-07-01 64 views
1

如果我有一個多處理器安裝程序和兩個訪問相同內存的線程(假設同一個實際的字節或單詞,不僅是「同一個區域」),是否會導致錯誤本身?對內存的並行讀/寫訪問是否會導致錯誤/違規?

如果兩個線程不僅是讀取,而且寫入和組合讀寫(例如,線程1嘗試在線程2正在嘗試寫入的同時讀取,或者如果兩個線程都試圖在同時)。這是否會導致錯誤/ BSOD/AV,或者是行爲未定義的唯一問題? (根據實際的時間點,其中一個線程將得到錯誤的數據)

+1

您不會破壞您的計算機,因爲物理上一次只會有一次內存操作;只是你不能預測這兩個進程最終會讀取什麼,以及如果你不同步訪問,內存位置的最終值是什麼。 –

+0

我知道計算機不會中斷;),但是有可能某個線程(或兩者)會在出現這種情況時出錯並退出? – Cray

+1

否。所有操作都照常執行,只是它們的結果是不可預測的。 –

回答

0

1)不,線程在程序應用程序內存中隨處可讀/寫。 (好吧,可以保護一部分內存,如程序代碼內存以保護它)。

2)任何CPU內核都有自己的緩存,並且數據首先被複制,然後在緩存行中被修改適當的(不可預知的)時間返回到RAM。有特殊的cpu指令(如鎖)必須與其他指令(如cmpxchg)一起執行以確保原子(interlocked)RAM讀取,寫入或修改,某些指令默認爲原子。請記住:原子(互鎖)RAM訪問的長度只能是1,2,4或8(以及64位CPU下的16)字節。 對於更長的存儲器結構,您必須確保相應的鎖定(sinhronisation)機制(如Critical Section),以避免多個線程對存儲器進行不受控制的訪問。