1、题目
一个理发店由一个有张沙发的等候室和一个放有一张理发椅的理发室组成,没有顾客要理发时,理发师便去睡觉,当一个顾客走进理发店时,如果所有的沙发都已被占用,他便离开理发店,否则,如果理发师正在为其他顾客理发,则该顾客就找一张空沙发坐下等待;如果理发师因无顾客正在睡觉,则由新到的顾客唤醒理发师为其理发。在理发完成以后,顾客必须付费,直到理发师收费后才能离开理发店。
问:如果有多个理发师,并配有一名收银员,信号量该如何实现这一同步。
2、分析
临界资源:
- 设置一个整型变量count来对占用沙发的顾客计数;
- mutex1=1:实现理发师进程对客户的互斥访问
- mutex2=1:实现顾客进程对沙发的互斥访问
- mutex3=1:实现顾客进程对收银员的互斥访问
同步信号量:
理发师与顾客的同步
- empty=n:是否有空闲理发椅,n个理发师
- full=0:理发椅上是否坐有等待理发的顾客
顾客和收营员的同步
- payment=0:等待付费
- receipt=0:等待收费
//顾客进程没有while
wait(mutex2);
if(count>=N)
{
signal(mutex2);
离开;
}else{
count++;
signal(mutex2);
//进店坐下;
wait(empty);
离开沙发,坐到理发椅上;
wait(mutex2);
count--;
signal(mutex2);
signal(full);
正在理发;
wait(mutex3);
付费;
signal(payment);
wait(receipt);
signal(mutex3);
离开;
}
//理发师
while(true)
{
wait(full);
wait(mutex);
顾客理发;
signal(mutex);
signal(empty);
}
//收银员
while(true)
{
wait(payment);
收费;
signal(receipt)
}