单选题
生产者进程和消费者进程代码如下。生产者进程有一个局部变量nextProduced,以存储新产生的新项:
while(1){
/*produce an item in nextProduced*/
while((in+1) % BUFFER SIZE==out); /*do nothing*/
buffer[in]=nextProduced;
in=(in+1) % BUFFER SIZE;
}
消费者进程有一个局部变量nextConsumed,以存储所要使用的项:
while(1){
while(in==out); /*do nothing*/
nextConsumed=buffer[out];
out=(out+1) % BUFFER SIZE;
/*consume the item in nextConsumed*/
}
当in==out和(in+1)%BUFFER_SIZE==out条件成立的时候,缓冲区中item数目各是______。
- A.0,BUFFER_SIZE
- B.0,BUFFER_SIZE-1
- C.BUFFER_SIZE-1,0
- D.BUFFER_SIZE,0
【正确答案】
B
【答案解析】[解析] 通过阅读代码可知,变量in指向缓冲区中下一个空位,变量out指向缓冲区中的第一个非空位。BUFFER_SIZE是缓冲区最大能容纳的item数目。buffer中,非空的位置范围是[out,in-1]或者[out,BUFFER_SIZE-1]∪[0,in-1],即有如图所示的两种情况。
当in==out时,前一个操作肯定是运行了消费者进程(out追上了in),因为生产者进程中,当遇到(in+1)%BUFFER_SIZE==out时就忙等,即生产进程无法使in==out,所以此时缓冲区中item数目应该是0。
[*]
当(in+1)%BuFFER_SIZE==out时,即in差一个空位就追上out了,此时缓冲区中item数目应该是BUFFER_SIZE-1。
所以本题正确答案是B选项。