我遇到多個線程將相同的值寫入同一內存位置的情況。另外兩個線程將相同的值寫入相同的內存位置
這是否會導致內存位置存儲併發寫入導致的損壞值?
比方說,我有一個具有唯一ID的類A的對象。當它被線程使用時,這些線程將爲它們分配一個特定的ID,比如100.我的問題是:在所有線程都將100寫入此內存位置之後,id是否可以是除100之外的值?換句話說,我必須用互斥鎖來保護這個ID嗎?
我遇到多個線程將相同的值寫入同一內存位置的情況。另外兩個線程將相同的值寫入相同的內存位置
這是否會導致內存位置存儲併發寫入導致的損壞值?
比方說,我有一個具有唯一ID的類A的對象。當它被線程使用時,這些線程將爲它們分配一個特定的ID,比如100.我的問題是:在所有線程都將100寫入此內存位置之後,id是否可以是除100之外的值?換句話說,我必須用互斥鎖來保護這個ID嗎?
我認爲相同的值的多個非原子寫入被保證是安全的(即,產生相同的結果作爲一個寫),如果這兩個條件成立:
這兩個似乎是十分自然的期待,但我不知道他們是真正爲每一個可能的實現。
我想到的例子如下:
假設兩個過程的2字節值1
寫一些地址a
。該值被寫爲兩個獨立的原子字節:1
至地址a
和0
至地址a+1
。現在,如果我們有兩個進程(P
,Q
),都先寫值1
解決(說)10
,然後寫值0
解決11
,然後互不排斥,我們得到以下可能的執行:
P[1->10]
,P[0->11]
,Q[1->10]
,Q[0->11]
P[1->10]
,Q[1->10]
,P[0->11]
,Q[0->11]
P[1->10]
,Q[1->10]
,Q[0->11]
,P[0->11]
Q[1->10]
,Q[0->11]
,P[1->10]
,P[0->11]
Q[1->10]
,P[1->10]
,Q[0->11]
,P[0->11]
Q[1->10]
,P[1->10]
,P[0->11]
,Q[0->11]
無論哪種方式,我們寫1
兩次位置10
,並寫入0
兩次位置11
原子地。如果兩次寫入產生與一次寫入相同的結果,則上述任一序列都會產生相同的結果。
簡短的回答:是的,保守並保護你的關鍵部分使用互斥鎖。這樣,你可以保證你的代碼在每個可能的平臺上都能正常工作。
我無法想象這種情況會導致損壞的值,因爲寫入內存位置的值是相同的。 你能舉一個例子說明在我的算法會破壞的平臺上會發生什麼?即,由於併發寫入,ID最終成爲某個其他值。 –
@takwing:參見* Suor *對OP的評論。 – alk
這可能是平臺相關的。你需要知道這個寫法是否是原子性的,請嘗試在文檔中搜索它或者谷歌它。 – Suor