单选题
下面是一个并发进程的程序代码,正确的说法是______。
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选项。