单选题 下面是一个并发进程的程序代码,正确的说法是______。
semaphore x1=x2=y=1;
int c1=c2=0;
P1()} P2(){
P(x1); P(x2);
if(++c1==1) P(y); if(++c2==1) P(y);
V(x1); V(x2);
computer(A); computer(B);
P(x1); P(x2);
if(--c1==0) V(y); if(--c2==0) V(y);
V(x1); V(x2);
} }
  • A.进程不会死锁,也不会饥饿
  • B.进程不会死锁,但是会饥饿
  • C.进程会死锁,但是不会饥饿
  • D.进程会死锁,也会饥饿
【正确答案】 B
【答案解析】首先分析题目的用意,根据信号量的位置可以看出x1和x2分别是控制访问c1和c2的互斥信号量,而P1和P2两个进程争夺的是信号量y,当P1占用y时,所有的P1进程都可以直接访问,P2进程需要等待,只有所有的P1进程执行完,将y释放之后P2才可以占用y并开始执行。此处有些类似两种读者的问题,当一种读者在读时,同类读者可直接开始读,而另一类读者则需要等待当前读者全部读完才可以开始读。 考虑一个极端情况,即当某种读者占用信号量y并络绎不绝地到来时,另一种读者就会无限等待下去,从而造成饥饿。 由于有信号量的控制,死锁的可能性没有了(即不可能出现两进程同时占用y并开始计算的情况)。 因此会出现饥饿,但不会出现死锁,答案选择B选项。