Peterson解法解決的是進程中競爭的問題,比如:有兩個進程——進程0、進程1要讀取共享內存中的數據,假設他們幾乎同時進入了共享內存中,那麼就會造成一定的問題。
代碼如下:
#define N 2 //進程數爲2
int turn; //現在輪到哪個進程?
int interested[N]; //初始化置爲false,即沒有在臨界區等待讀寫共享數據的
void enter_region(int process) //進入臨界區
{
turn = process;
int other = 1 - turn; //另一個進程
interested[turn] = true;
while(turn == process && interested[other] == true)
; //一直循環,直到other進程退出臨界區
}
void leave_region(int process)
{
interested[process] = false;
}
進程通信時無非會產生下列的兩種情況:
1、進程0通信,進程1不影響。(反之亦然)
enter_region()中各參數的值:
turn = 0;
other = 1;
interested[0] = true;
interested[1] = false;
while循環直接在interested[other]那一步就退出了,進程0成功進入臨界區。
2、進程0通信,進程1也要通信。(反之亦然)
進程0的狀態如上。
進程1在enter_region()後各參數的值:
turn = 1;
other = 0;
interested[1] = true;
interested[0] = true;
while循環持續,直到進程0調用leave_region()退出臨界區,使得interested[0] = false。