2015-11-04 57 views
2

我發現了一個解決互斥問題的在線問題,它有兩個進程P0和P1。 (假設可變被初始化爲0)我的解決方案是否滿足互斥要求?

volatile int turn; 

過程P0:

/* Other code */ 
    while (turn != 0) { } /* Do nothing and wait. */ 
    Critical Section /* . . . */ 
    turn = 1; 
    /* Other code */ 

過程P1:

/*Other code*/ 
    while (turn != 1) { } /* Do nothing and wait. */ 
    Critical Section /* . . . */ 
    turn = 0; 
    /* Other code */ 

這如何溶液解決的互斥問題?我完全不理解它。

回答

1

假設沒有其他代碼可以將turn設置爲0或1以外的值,並且假設唯一與turn變量混淆的是P0和P1,則這確實解決了互斥屬性。具體來說,你說turn初始化爲0.這意味着P1不能進入臨界區:它在while (turn != 1)循環中處於忙狀態,並且它將保持在該循環中,直到設置了turn == 1。鑑於我們的假設,只有P0和P1更改turn這意味着直到P0設置turn爲1所以P0將立即退出它的while (turn != 0)循環(如turn最初是0),並安全地進入臨界區P1不能進入臨界區。它知道P1只能在turn設置爲1並且只有在P0離開臨界區之後才能進入臨界區。一旦P0將turn設置爲1,P0將卡在它的while (turn != 0)循環中,直到P1將其設置爲空,所以現在P1處於臨界區並且P0不能在其中。等等。

一個簡單的方法來認爲這是兩個人及BATTON。他們都同意不做任何事情(進入他們的關鍵部分),除非他們持有電話。所以Person 1開始時就有了batton,並且可以自由地去做任何事情,因爲他知道Person 2不能做任何事 - 他們沒有batton。第一個人完成後,他們將電話交給第二個人。第二個人現在可以自由地做他們想做的任何事情,他們知道第一個人什麼都不做,只是等待電話交給他們。

+0

感謝這樣的清晰解釋! :D你是個天才奧利弗。 – Tia

0

由於@JustinSteele指出,這絕對不解決互斥問題。也許如果你將轉變爲一個布爾值,你可能會得到一個骯髒的修復,因爲一個布爾值只包含兩個值。如果你想要一個更合適的方式來提供互斥,我會建議看一下互斥量,信號量和條件變量。祝你好運!

+0

Oliver確實聲明轉身可以是0或1的假設。但是,對不起,我不清楚這一點! – Tia

0

如果兩個P0和P1都執行,並且每個都只執行一次,那麼在P1執行之前,P0將首先專門進入臨界區段。

在Java內存模型來看,這個程序是正確同步,因爲所有的線程間的行爲是揮發性的讀取和寫入。因此程序順序一致,便於分析。

或者更具體地說,所有揮發性讀取和寫入的總訂單(這是與編程順序一致);這個命令將保證關鍵部分的互斥性。


但是,這裏存在嚴重的問題。如果P1先到達,則不管P0到達多晚,它都必須等待P0。這很不公平。而且,如果沒有執行P0,則P1不能前進。而且,如果P0執行且P1不執行,則P0不能再次進入臨界區(它必須等待P1重置該轉)。這種鎖定機制只允許嚴格的P0-P1-P0-P1 -...序列(除非這正是期望的)

爲了解決這個問題,有德克爾的算法,Peterson的算法,等等。看到這個職位 - https://cs.stackexchange.com/a/12632

相關問題