操作系统理发师问题P、V操作

本文介绍了理发师问题,这是一个经典的并发控制问题。在理发店里,理发师根据顾客数量决定是否工作,而顾客则根据店内椅子数量决定是否等待或离开。通过信号量机制,解冑了理发师和顾客的同步问题,确保资源的有效利用和避免死锁。顾客和理发师分别使用互斥信号量和条件变量进行操作,确保了系统的正确运行。
摘要由CSDN通过智能技术生成

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

一、问题描述

理发店里有一位理发师、一把理发椅和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);}				//没有多的椅子,顾客离开
}
  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值