单选题 进行P0和P1的共享变量定义及其初值为:
boolean flag[2];
int turn=0;
flag[0]=false; flag[1]=false;
若进行P0和P1访问临界资源的类C代码实现如下:
void P0()//进程P0
{ while (TRUE)
{ flag[0]=TRUE; turn=1;
While (flag[1]&&(turn==1));
临界区;
flag[0]=FALSE;
}
}
void P1()//进程P1
{ while (TRUE)
{ flag[1]=TRUE; turn=0;
while (flag[0]&&(turn==0));
临界区;
flag[1]=FALSE;
}
}
并发执行进程P0和P1时产生的情况是______。
  • A.不能保证进程互斥进入临界区、会出现“饥饿”现象
  • B.不能保证进程互斥进入临界区、不会出现“饥饿”现象
  • C.能保证进程互斥进入临界区、会出现“饥饿”现象
  • D.能保证进程互斥进入临界区、不会出现“饥饿”现象
【正确答案】 D
【答案解析】[解析] 在之前没有了解过该算法的情况下,临场想要判断出来还是很难的,尤其本题的算法是一个可以保证进程互斥进入临界区、不会出现“饥饿”现象的良好算法。在考虑的时候,没法找出破绽,还容易误认为自己的想法不够全面。本题中算法利用了flag[]解决临界资源的互斥访问,利用turn解决“饥饿”现象,所以能够保证进程互斥进入临界区,不会出现“饥饿”现象。实际上,该算法满足同步机制准则,可以达到比较好的同步效果。 对于此类型的题目,可以多分析一些经典的互斥算法。本题为Peterson算法,此外还有Dekker算法等,读者可以进行分析理解。