2017-10-16 143 views
1

我目前正在研究互斥鎖如何工作。我覺得我有一種抓地力。我的假設是否正確?這裏我們有兩個進程Pi和Pj,它們想要執行他們的關鍵部分,並且試圖解釋互斥鎖如何工作以防止競爭狀況的發生。互斥鎖如何工作?

enter image description here

裨嘗試獲取與獲取鎖()。在開始時,沒有進程正在執行其關鍵部分,因此可用將是真實的。在acquire的while循環中,條件將爲false,並且不會「忙等待」,並且可用將設置爲false。可用設置爲false的原因是爲了防止其他進程進入其關鍵部分。另一方面,Pj將不被允許執行其關鍵部分,因爲可用被Pi設置爲假。 !可用將是真實的,因此Pj將卡在「忙等待」中。

一旦Pi完成其關鍵部分,它調用release()。 release方法將可用的布爾變量重置爲true。一旦可用被設置爲true,Pj將停止在「忙等待」,因爲現在!availale會給出一個錯誤的值。 Pj將設置爲false並執行其關鍵部分。這個循環重複進行下一個過程,想要獲得鎖定來執行其臨界區域

回答

1

您的解釋是正確的,但不要太擔心執行acquire()

舉例來說,acquire()的這種實現具有available的競態條件。

此代碼僅僅是一個例子來說明互斥體的使用(在這種情況下,一個spinlock),並瀏覽了實現的細節。

+0

謝謝您的反饋。 – asilvester635

1

上面實現的鎖有點類似於自旋鎖,除了它應該使用CAS(比較和交換)原子操作來保證正確性。總體思路以實現互斥獲取()是:互斥

  1. 檢查是否可用
  2. 如果可用,然後標記互斥體使用。否則,直到調度程序釋放互斥體後再次運行線程。
+0

感謝您的反饋。 – asilvester635