理发师问题
1.问题描述
(1)理发店里有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子
(2)如果没有顾客,理发师便在理发椅上睡觉
(3)一个顾客到来时,它必须叫醒理发师
(4)如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开
2.算法设计
int waiting=0; //等候理发顾客数
int CHAIRS=N; //为顾客准备的椅子数
semaphore customers,barbers,mutex;
customers=0;barbers=0;mutex=1;
cobegin
process barber( ) {
while(true) {
P(customers); //有顾客吗?若无顾客,理发师睡眠
P(mutex); //若有顾客时,进入临界区
waiting--; //等候顾客数少一个
V(barbers); //理发师准备为顾客理发
V(mutex); //退出临界区
cut_hair(); //理发师正在理发(非临界区)
}
}
process customer_i( ) {
P(mutex); //进入临界区
if(waiting<CHAIRS) { //有空椅子吗
waiting++; //等候顾客数加1
V(customers); //唤醒理发师
V(mutex); //退出临界区
P(barbers); //理发师忙,顾客坐下等待
get_haircut(); //否则顾客坐下理发
}
else
V(mutex); //人满了,离开!
}
coend
3.总结
理发师问题和生产者消费者问题在于
(1)当等候理发的凳子被坐满时候,顾客离开,即资源不满足的情况下,进程结束;当缓冲区满的时候,生产者出现等待事件,等到资源满足时往下执行,即资源不满足的情况下,进程等待。
(2)当资源用信号量表示,资源不满足的情况下进程等待,所以理发师问题中,椅子不因该用信号量表示而因该用变量表示,再加上一个互斥信号量。
(3)生产者消费者可以更改公共资源如缓冲区empty当前值,无论资源是否满足;而理发师问题中对于公共的资源椅子,资源条件不满足时,顾客是不能更改waiting的值。