操作系统原理,理发师问题

一、问题描述

理发店里有一位理发师、一把理发椅和n 把供等候理发的顾客坐的椅子。如果没有顾客,理发师便在理发椅上睡觉;当一个顾客到来时,它必须叫醒理发师;如果理发师正在理发时又有顾客来到,那么,如果有空椅子可坐,顾客就坐下来等待,否则就离开理发店。

二、解决方法

(解法一):
可以从题中发现,我们在需要的信号量有:
顾客数量(开局没有顾客)customers=0;
理发师(开局睡觉) barbers=0;
等待人数 waiting=0;
互斥信号(人数不能同时增加减少)mutex=1;
椅子的数量 CHAIRS;
理发师:

void barbers(void){
	while(TRUE){				//理发师需要查看是否还有有顾客;
		P(customers);			//若没有顾客,理发师就将阻塞在这里;若有顾客,则继续执行
		P(mutex);				//实现信号量互斥
		waiting=wait-1;		    //等待人数减一
		V(barbers);				//理发师出现
		V(mutex);				//停止互斥
		cutHair();			    //开始理发
}
}

顾客:

void customer(void){
	P(mutex);						//顾客出现,先实现互斥
	if(waiting<CHAIRS){				//如果等待的人数比店里的椅子少,则实现下面的操作
		waiting=waiting+1;			//等待的人数+1
		V(mutex);					//结束互斥
		P(barbers);					//看是否还有理发师,没有则阻塞在这里,有则继续
		getHairCut();}				//执行理发
	else {V(mutex);}				//没有多的椅子,顾客离开
}
Logo

鸿蒙生态一站式服务平台。

更多推荐