1. 程式人生 > >理解Peterson演算法

理解Peterson演算法

先上演算法程式碼:

int turn;
int interested[2];

void enter_region(int process)//在進入臨界區前呼叫
{
	int other = 1 - process;
	interested[process] = true;
	turn = process;
	while ( turn == process && interested[other] = true);
}

void leave_region(int process)//在進入臨界區後呼叫
{
	interested[process] = false;
}

我們考慮兩個程序P0,P1, 假設P0,P1都想進入臨界區(即interested = true)。直接考慮P0馬上要處理的程式碼是最後的while迴圈,在這之前無所謂P1是否已經在臨界區,因為P0還沒有進入臨界區。

如果turn = 0,則P1應該是隻執行到turn行之前(或者更簡單P1不想進入臨界區),此時如果P1處於interested行前,則P0直接跳出迴圈進入臨界區。這種情況下,P1不可能進入臨界區(因為此時interested[0] = true)。如果P1執行了interested行,則P0先迴圈等待P1執行turn行,然後跳出迴圈進入臨界區(因為此時turn = 1,不滿足迴圈條件)。P0先turn,所以P0先進入臨界區,此時滿足先到先得原則。

如果turn = 1,則P1此時也馬上要執行while迴圈或者已經在運行了,此時P0直接跳出迴圈進入臨界區。注意此時P1不可能已經在臨界區,因為interested[0] = true。那有沒有可能P1在interested[0] = false時已經執行到這了呢? 這是可能的,但是顯然此時P0並沒有進入臨界區,不違反互斥原則。