进程p1的临界区代码cs1 ;
flag[1]=false ;
进程p1的其他代码;
}
算法2存在的问题
此算法解决了空闲让进的问题,但有可能两个进程同时进入临界区。
当两个进程都未进入临界区时,它们各自的访问标志值都为false,若此时刚好两个进程同时都想进入临界区,并且都发现对方标志值为false,于是两个进程同时进入了各自的临界区,这就违背了临界区的访问原则忙则等待。
算法3的思想
本算法仍然设置标志数组flag[ ],但标志用来表示进程是否希望进入临界区。在每个进程访问临界资源之前,先将自己的标志设置为真,表示进程希望进入临界区,然后再检查另一个进程的标志。若另一个进程的标志为真,则进程等待;否则进入临界区。
算法3的描述
enum boolean {false,true};
boolean flag[2]={false,false};
p0: while (true)
{
flag[0]=true;
while flag[1];
进程p0的临界区代码cs0 ;
flag[0]=false;
进程p0的其他代码;
}
算法3的描述(续)
p1: while (true)
{
flag[1]=true;
while flag[0];
进程p1的临界区代码cs1 ;
flag[1]=false;
进程p1的其他代码;
}
算法3存在的问题
该算法可以有效地防止两个进程同时进入临界区,但存在两个进程都进不了临界区的问题。
当两个进程同时想进入临界区时,它们分别将自己的标志位设置为true,并且同时去检查对方的状态,发现对方也要进入临界区,于是双方互相谦让,结果谁也进不了临界区。
算法4的思想
本算法的基本思想是算法3和算法1的结合。是一个正确的算法。
标志数组flag[ ]表示进程是否希望进入临界区或是否正在临界区中执行。还设置了一个turn变量,用于指示允许进入临界区的进程标识。
算法4的描述
enum boolean {false,true};
boolean flag[2] ={false,false}; int turn;
p0: while (true)
{
flag[0]=true; turn=1;
while (flag[1] && turn = = 1);
进程p0的临界区代码cs0 ;
flag[0]=false ;