【正确答案】semaphore mutex=1, customer_count=0:
main()
{
Cobegin
Customeri()
{
p(mutex);
取号码,进入队列;
v(mutex);
v(customer_count);
}
serversi()
{
while(1)
{
p(customer_count);
p(mutex);
从队列中取下一个号码;
v(mutex);
为该号码持有者服务;
}
end
Coend
【答案解析】[解析] 顾客相当于生产者,柜员相当于消费者,所有顾客领取号码后就进入了一个等待队列,该等待队列相当于缓冲区。这个问题基本符合一般意义的“生产者一消费者”问题,但又有所不同,不同在于顾客(即生产者)“取号进入等待队列”操作不需要与柜员(消费者)同步,所以,只需要两个信号量即可,一个用于互斥访问等待队列(对于顾客,就是互斥使用柜员机取号;对于柜员,就是叫号时候互斥访问等待队列),一个用于柜员“叫号”操作与顾客的同步。