考虑以下使用信号量的生产者-消费者问题的过程,并选择正确的语句:
semaphore n = 0;
semaphore s = 1;
// Producer Function
void producer(){
while(true){
produce();
semWait(s);
addToBuffer();
semSignal(s);
semSignal(n);
}
}
// Consumer function
void consumer(){
while(true){
semWait(s);
semWait(n);
removeFromBuffer();
semSignal(s);
consume();
}
}
(A)生产者将能够将一个项目添加到缓冲区中,但是消费者永远不能消费它。
(B)消费者将从缓冲区中删除不超过一项。
(C)如果使用者在缓冲区为空时成功获取信号量s,则会发生死锁。
(D)对于无死锁操作,信号量n的起始值必须为1,而不是0。答案: (C)
说明:最初,缓冲区中没有元素。信号量s = 1和信号量n = 0。我们假设缓冲区为空时,最初的控制权交给了使用者。 semWait减小信号量’的值。现在,s = 0且semWait(n)减小了信号量’n’的值。由于信号量’n’的值小于0,因此控件陷入了函数semWait()的while循环中,并出现了死锁。因此,如果使用者在缓冲区为空时成功获取信号量s,则会发生死锁。
这个问题的测验
如果您在以上帖子中发现任何错误,请在下面发表评论