德国数学家Dekker曾提出了两个进程互斥的算法,不过Dekker算法过于复杂。而Peterson提出了简单且一流的方法。
实现如下:
boolean flag[2];
int turn;
void P0()
{
while(true)
{
flag[0]=true;
turn=1;
while(flag[1]&&turn==1)
/* donothing*/ ;
/*critical section*/ ;
flag[0]=false;
}
}
void P1()
{
while(true)
{
flag[1]=true;
turn=0;
while(flag[0]&&turn==0)
/* donothing*/ ;
/*critical section*/ ;
flag[1]=false;
}
}
void main()
{
flag[0]=flag[1]=false;
/*start p0 and p1*/ ;
}
说明:
考虑进程P0,一旦它设置flag[0]=true,则P1不能进入临界区。如果P1已经进入临界区,那么flag[1]=true,P0被阻塞不能进入临界区。
另一方面,互相阻塞也避免了。假设P0在while里被阻塞了,表示flag[1]为true且turn=1,则此时P1可以执行。