2011-09-10 55 views
3

我感興趣的是互斥體如何工作。我認識到他們的每一個網站,我發現目的解釋他們做了什麼,但我一直無法理解在這種情況下會發生什麼:如果兩個用戶同時鎖定互斥鎖,會發生什麼情況?

有同時運行兩個線程,他們試圖鎖定對互斥同時。

這不會是單核的問題,因爲這種情況永遠不會發生,但在多核系統中,我認爲這是一個問題。我看不到任何方法來防止這樣的併發問題,但它們顯然存在。

感謝所有幫助

+0

我敢肯定多核系統有某種機制,無論是在OS /管理程序層面還是在CPU /總線管理,使這不可能發生。 –

+0

它們不能被互斥的點它只能獲取一次 –

+0

兩個線程(或10個線程)可_try_同時鎖定互斥,但只有一個會成功。它可以與單核發生 - 操作系統將從線程切換到線程的時候,它可以從一個線程切換出來只是當它試圖鎖定一個互斥體,並切換到立即嘗試鎖定另一個線程相同的互斥體,並且這必須正確工作。 – gnasher729

回答

5

正確實施互斥鎖時,永遠不會同時鎖定互斥鎖。爲此,您需要一些原子操作(保證是一次發生在對象上的唯一操作),這些操作具有有用的屬性。

一個這樣的操作是在x86架構中的xchg(交換)。例如,xchg eax, [ebp]將讀取地址ebp處的值,將eax中的值寫入地址ebp,然後將eax設置爲讀取值,同時保證這些操作不會與對該地址的併發讀取和寫入交錯。

現在你可以實現一個互斥量。要鎖定,請將1加載到eax,使用互斥鎖的值交換eax,然後查看eax。如果它是1,它已經被鎖定,所以你可能想睡覺,稍後再試。如果是0,則只是鎖定了互斥鎖。要解鎖,只需將值0寫入互斥鎖即可。

請注意,我在這裏粉飾的重要細節。舉例來說,X86的xchg是在單個處理器上搶先式多任務足夠的原子。當你共享多個處理器之間的存儲器(例如,在多核系統),除非你使用lock前綴(例如lock xchg eax, [ebp],而不是xchg eax, [ebp]),這ensures that only one processor can access that memory while the instruction is executed這是不夠的。

+1

針對多核x86的'LOCK'前綴說明,例如'LOCK XCHG eax,[ebp]'。 –

+0

@MarkKCowan好點!我會更新答案以更好地反映SMP情況。 – 2015-09-25 15:40:16

7

這是不可能的2個線程鎖定系統範圍的互斥,一會鎖定其他將被阻止。

互斥/鎖的語義!確保在任何時候只有一個線程可以在鎖定呼叫之外執行 。第一個線程達到 該調用獲得互斥鎖的鎖定。任何後來的線程都會在調用互斥/鎖的時候阻塞 !直到擁有鎖 的線程通過互斥/解鎖來釋放鎖!

關於如何實現這一點,請看看test-and-set

在計算機科學中,檢查並設置指令是用於寫入的存儲器位置,並返回它的舊值作爲 單個原子(即,不可中斷的)操作的指令 。如果多個進程可以訪問相同的內存,並且如果進程當前執行測試並設置,則在第一個進程完成之前,沒有其他進程可以開始另一個進程測試並設置。 CPU可以使用其他電子組件提供的 測試和設置指令,例如 作爲雙端口RAM; CPU也可以自己提供測試和設置指令 。

如果舊值爲0,則調用進程將獲得鎖。它會將 寫入變量1直到發生此情況。