您的位置:首页 > 其它

互斥——Peterson解法(个人见解)

2012-12-30 12:07 253 查看
//原版的Peterson互斥算法

#define TRUE 1
#define FALSE 0
#define N 2                      /*进程的数量*/

int interested
= {0};               //所有值的初始化为0(FALSE) 
int turn;                     //现在轮到谁?

void enter_region(int id)                //进程是0或1
{
int other;                      //其他进程号

other=1-id;                      //另一进程
interested[id] = TRUE;                  //表明所感兴趣的
turn = id;                      //设置标志
while(turn == id && interested[other]==TRUE);       //空语句
}

void leave_region(int id)                //进程:谁离开?
{
interested[id] = FALSE;                //表示离开临界区
}

//稍微修改后的Peterson互斥算法

#define N 32

int interested
= {0};
int turn;

void enter_region(int id)
{
interested[id] = 1;
turn = id;
while(turn == id && othersInterested(id));
}

void leave_region(int id)
{
interested[id] = 0;
}

int othersInterested(int id)
{
int result=0;
for(int i=0;i<N;i++)
{
if(i != id)
result = result || interested[i];
}
return result;
}

注:参照第二个稍微修改的Peterson算法比较好理解以下说明

此算法,用于两个互斥进程时,就能实现互斥,当一个进程进入临界区后,另一进程就只能等待;而当有三个以上的进程时,假设第一个进程,先进入临界区,接着到第二个进程尝试进入临界区,由于,前一进程已进入,即是相对于第二个进程之外的进程对临界区感兴趣(interested[other]==TRUE),(turn == id && interested[other]==TRUE)==TRUE所以第二个进程等待;在第一个进程没有离开临界区时,这时第三个进程对临界区感兴趣,也尝试时入,当然和进程二一样受到阻塞而等待,而全局变量ture值变为第三个进程的值(假设该值与第二个进程的ture值不同);此时,如果发生中断,调度回进程二,因为进程二阻塞在while(turn == id && interested[other]==TRUE)中,当进程二再次检测turn == id && interested[other]==TRUE时,发现turn==id为假,所以(turn == id && interested[other]==TRUE)为假,进程二不再受阻塞,从而在第一个进程没有离开临界区前第二个进程进入临界区,这样也就有危险。

这是我个人的见解,如果有误的或不明的地方希望大家指出,作点评论什么的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: