理发师睡眠问题



理发师睡眠问题:
(一)问题:
有一个理发师,有一个理发椅,5个等候椅,如果没有顾客,则理发师睡觉,如果有顾客,则叫醒理发师;理发师理发时,如果有顾客过来,且有等候椅,则坐下来等候;如果没有等候椅,则离开。
(二)分析:
5个信号量,一个控制变量,waiting其实是5-waitChair的一个拷贝的,只所以用waiting是由于无法获取当前waitChair的当前值。

int waiting=0;//等候的顾客,不包含正在理发的顾客
Semaphore wait_mutex;//保护waiting的修改。
Semaphore baberChair=1;//临界资源;理发的椅子
Semaphore waitChair=5;//;临界资源;等候的椅子
Semaphore customer_ready=0;//顾客是否准备好
Semaphore baber_finish=0;//理发师是否完成理发

//customer_ready,baber_finish为同步信号量,同于传递消息。
顾客准备好,则理发师开始理发;
即顾客准备好-》V,P-》理发师理发;
理发师完成理发-》顾客离开;
即理发师完成理发-》V,P-》顾客离开理发椅;

(三)实现:
main(){
 baber();
 customer();
}
baber(){
 while(1){
  customer_ready();//接受消息,顾客准备好,
  开始理发;
  baber_finish();//发消息,理发师理完发
 }
}

customer(){
 p(wait_mutex);//保护对waiting的修改。
  if(waiting<5){
  waiting++;
  v(wait_mutex);
  }
  else{
  v(wait_mutex);
  离开;
  }

  p(waitchair);//找一个空椅子
 
  p(baberchair);//占有理发椅
  v(waitchair);//只有占到了理发椅,才可以将waitChari++;
  //因为只有占到了理发椅,才说明上个人理完发,所以才释放等候椅。

  v(customer_ready);//通知理发师已经准备好
  p(finish);//理发完成,可以离开。
  v(baberChair);//释放理发椅

  p(wait_mutex);//等候的人可以释放一个等候椅,到理发椅,准备理发
  waiting--;
  v(wait_mutex); 
}

(四)理发师睡眠问题变形之银行排队问题:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值