进程互斥的软件实现方法
单标志法
两个进程在访问完临界区后,会把使用临界区的权限转交给另一个进程。也就是说每一个进程进入临界区的权限只能被另一个进程赋予
int turn=0;//表示当前允许进入临界区的进程号
//Process0:
while(turn!=0); //判断当前的可执行的进程是不是自己
critical section;
turn=1;
remainder section;
//process1:
while(turn!=1);
critical section;
turn=1;
remainder section;

但是,单标志法违反了空闲让进的原则
双标志先检查
设置了一个bool类型的数组flag[],数组中,各个元素用来标记各进程想进入临界区的意愿,比如flag[0]=true 代表p0想要进入临界区
bool flag[2];
flag[0]=false;
flag[1]=false;//初始化
//process0:
while(flag[1]);//检查
flag[0]=true;//表达意愿上锁
critical section;
flag[0]=false;//解锁
remainder section;
//process1:
while(flag[0]);
flag[1]=true;
critical section;
flag[1]=false;
remainder section;

违反了:忙则等待的原则
进入区的检查和上锁,两个处理不是一气呵成的,检查后,上锁前可能发生进程切换
双标志后检查
因为前检查无法一起喝成,所以我们想到了用先锁定的方法来解决两个进程同时进入临界区的问题
bool flag[2];
flag[0]=false;
flag[1]=false;//初始化
//process0:
flag[0]=true;//表达意愿上锁
while(flag[1]);//检查
critical section;
flag[0]=false;//解锁
remainder section;
//process1:
flag[1]=true;
while(flag[0]);
critical section;
flag[1]=false;
remainder section;
这个虽然解决了忙则等待问题,但是又违背了“空闲让进”和“有则等待”原则,会因各进程都长期无法访问临界资源而产生饥饿现象
Peterson算法
结合了单标志和双标志法的思想,让进程尝试谦让
bool flag[2];
int turn=0;
//process0:
flag[0]=true;//表示自己想要使用
turn=1;//谦让,如果p1想要用。就给p1用
while(flag[1]&&turn==1);//如果p1确实想要用,并且最后一次谦让是自己发出给p1,那就等待
critical section;
flag[0]=false;//不想用了
remainder section;
//process1:
flag[1]=true;
turn=0;//谦让,如果p0想要用。就给p0用
while(flag[0]&&turn==0);//如果p0确实想要用,并且最后一次谦让是自己发出给p0,那就等待
critical section;
flag[0]=false;//不想用了
remainder section;
虽然解决了空闲让进,忙则等待,有限等待三个原则,但是依然没有遵守让权等待原则