转载自:https://blog.csdn.net/geekcome/article/details/7098881
实现如下:
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可以执行。