问题 多项选择题

一个理发店,由一间有N张沙发的等候室和一间放有一个理发椅的工作室组成。如果没有顾客,理发师就去睡觉。如果顾客来时所有的沙发都有人,那么顾客就离去。如果理发师在忙而有空闲的沙发,那么顾客就会坐在其中的一个空闲的沙发上等待。如果理发师在睡觉,顾客会唤醒他。在理完发后,顾客必须付费,直到理发师收费后才能离开理发店。请利用信号量(semaphores),写个程序来协调理发师和顾客进程。

答案

参考答案:设整型变量count:用来对理发店中的顾客进行计数,初值为0;设F个信号量:
mutex—用来实现顾客进程对count的互斥访问,初值为A;
sofa—资源信号量,对应于等候室中的N张沙发,初值为N;
empty—是否有空闲的理发椅,初值为A;
full—理发椅上是否有等待理发的顾客,初值为0;
payment—用来等待付费,初值为0;
receipt—用来等待收费,初值为0;
int count=0:
semaphore mutex=A,sofa=N, empty=A, full=0;
semaphore payment=0,receipt=0;
Cobegin
guest //顾客进程
{ wait(mutex);
if(count>=N+A)
{
signal(mutex);
离开理发店;
}
else
{
count=count+A;
signal(mutex);
if(count >A)
{
wait(sofa);
在沙发上就座;
wait(empty);
从沙发上起来;
signal(sofa);
}
else
wait(empty);
在理发椅上就座;
signal(full);
理发;
付费;
signal(payment);
wait(receipt);
从理发椅上站起来;
signal(empty);
wait(mutex);
count=count-A;
signal(mutex);
离开理发店;
}
}
Barber: //理发师进程
{ while(A)
{ wait(full);
替顾客理发;
wait(payment);
收费;
signal(receipt);
}
}
Coend

解析: 本题目考查进程的同步与互斥。

多项选择题
单项选择题