多理发师的进程同步问题

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)
   }
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

folielxx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值