0

我遇到多個線程將相同的值寫入同一內​​存位置的情況。另外兩個線程將相同的值寫入相同的內存位置

這是否會導致內存位置存儲併發寫入導致的損壞值?

比方說,我有一個具有唯一ID的類A的對象。當它被線程使用時,這些線程將爲它們分配一個特定的ID,比如100.我的問題是:在所有線程都將100寫入此內存位置之後,id是否可以是除100之外的值?換句話說,我必須用互斥鎖來保護這個ID嗎?

+0

這可能是平臺相關的。你需要知道這個寫法是否是原子性的,請嘗試在文檔中搜索它或者谷歌它。 – Suor

回答

1

我認爲相同的值的多個非原子寫入被保證是安全的(即,產生相同的結果作爲一個寫),如果這兩個條件成立:

  • 非原子寫入從構造一系列原子寫入
  • 幾個原子相同的值的一個位置寫入產生相同的值

這兩個似乎是十分自然的期待,但我不知道他們是真正爲每一個可能的實現。

我想到的例子如下:

假設兩個過程的2字節值1寫一些地址a。該值被寫爲兩個獨立的原子字節:1至地址a0至地址a+1。現在,如果我們有兩個進程(PQ),都先寫值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原子地。如果兩次寫入產生與一次寫入相同的結果,則上述任一序列都會產生相同的結果。

1

簡短的回答:是的,保守並保護你的關鍵部分使用互斥鎖。這樣,你可以保證你的代碼在每個可能的平臺上都能正常工作。

+0

我無法想象這種情況會導致損壞的值,因爲寫入內存位置的值是相同的。 你能舉一個例子說明在我的算法會破壞的平臺上會發生什麼?即,由於併發寫入,ID最終成爲某個其他值。 –

+0

@takwing:參見* Suor *對OP的評論。 – alk

相關問題