我感興趣的是互斥體如何工作。我認識到他們的每一個網站,我發現目的解釋他們做了什麼,但我一直無法理解在這種情況下會發生什麼:如果兩個用戶同時鎖定互斥鎖,會發生什麼情況?
有同時運行兩個線程,他們試圖鎖定對互斥同時。
這不會是單核的問題,因爲這種情況永遠不會發生,但在多核系統中,我認爲這是一個問題。我看不到任何方法來防止這樣的併發問題,但它們顯然存在。
感謝所有幫助
我感興趣的是互斥體如何工作。我認識到他們的每一個網站,我發現目的解釋他們做了什麼,但我一直無法理解在這種情況下會發生什麼:如果兩個用戶同時鎖定互斥鎖,會發生什麼情況?
有同時運行兩個線程,他們試圖鎖定對互斥同時。
這不會是單核的問題,因爲這種情況永遠不會發生,但在多核系統中,我認爲這是一個問題。我看不到任何方法來防止這樣的併發問題,但它們顯然存在。
感謝所有幫助
正確實施互斥鎖時,永遠不會同時鎖定互斥鎖。爲此,您需要一些原子操作(保證是一次發生在對象上的唯一操作),這些操作具有有用的屬性。
一個這樣的操作是在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這是不夠的。
針對多核x86的'LOCK'前綴說明,例如'LOCK XCHG eax,[ebp]'。 –
@MarkKCowan好點!我會更新答案以更好地反映SMP情況。 – 2015-09-25 15:40:16
這是不可能的2個線程鎖定系統範圍的互斥,一會鎖定其他將被阻止。
互斥/鎖的語義!確保在任何時候只有一個線程可以在鎖定呼叫之外執行 。第一個線程達到 該調用獲得互斥鎖的鎖定。任何後來的線程都會在調用互斥/鎖的時候阻塞 !直到擁有鎖 的線程通過互斥/解鎖來釋放鎖!
關於如何實現這一點,請看看test-and-set。
在計算機科學中,檢查並設置指令是用於寫入的存儲器位置,並返回它的舊值作爲 單個原子(即,不可中斷的)操作的指令 。如果多個進程可以訪問相同的內存,並且如果進程當前執行測試並設置,則在第一個進程完成之前,沒有其他進程可以開始另一個進程測試並設置。 CPU可以使用其他電子組件提供的 測試和設置指令,例如 作爲雙端口RAM; CPU也可以自己提供測試和設置指令 。
如果舊值爲0,則調用進程將獲得鎖。它會將 寫入變量1直到發生此情況。
我敢肯定多核系統有某種機制,無論是在OS /管理程序層面還是在CPU /總線管理,使這不可能發生。 –
它們不能被互斥的點它只能獲取一次 –
兩個線程(或10個線程)可_try_同時鎖定互斥,但只有一個會成功。它可以與單核發生 - 操作系統將從線程切換到線程的時候,它可以從一個線程切換出來只是當它試圖鎖定一個互斥體,並切換到立即嘗試鎖定另一個線程相同的互斥體,並且這必須正確工作。 – gnasher729