问题 多项选择题

某银行有人民币储蓄业务,由n个柜员负责,有1台取号机。每个顾客进入银行后先取一个号,若有人取号则需等他人取完后才能取,取到号后等待叫号,当一个柜员人员空闲下来,就叫下一个号。试用P、V操作正确编写柜台人员和顾客进程的程序。

答案

参考答案:semaphore mutex=A, customer_count=0:
main()
{
Cobegin
Customeri()
{
p(mutex);
取号码,进入队列;
v(mutex);
v(customer_count);
}
serversi()
{
while(A)
{
p(customer_count);
p(mutex);
从队列中取下一个号码;
v(mutex);
为该号码持有者服务;
}
end
Coend

解析: 顾客相当于生产者,柜员相当于消费者,所有顾客领取号码后就进入了一个等待队列,该等待队列相当于缓冲区。这个问题基本符合一般意义的“生产者一消费者”问题,但又有所不同,不同在于顾客(即生产者)“取号进入等待队列”操作不需要与柜员(消费者)同步,所以,只需要两个信号量即可,一个用于互斥访问等待队列(对于顾客,就是互斥使用柜员机取号;对于柜员,就是叫号时候互斥访问等待队列),一个用于柜员“叫号”操作与顾客的同步。

多项选择题
单项选择题