实现如下:
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可以执行。