1. 睡眠理发师问题

理发店里有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子。如果没有顾客,则理发师便在理发椅上睡觉,如图2-20所示。当一个顾客到来时,他必须先叫醒理发师,如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,他们就坐下来等。如果没有空椅子,他就离开。这里的问题是为理发师和顾客各编写一段程序来描述他们的行为,要求不能带有竞争条件。

我们的解法使用三个信号量:customers,用来记录等候理发的顾客数(不包括正在理发的顾客);barbers,记录正在等候顾客的理发师数,为0或1;mutex,用于互斥。我们还需要一个变量waiting,它也用于记录等候的顾客数,实际上是customers的一份拷贝。之所以使用waiting是因为无法读取信号量的当前值。在该解法中,进入理发店的顾客必须先看等候的顾客数,如果少于椅子数,他留下来等,否则他就离开。

我们的解法示于图2-21。

 1     # define CHAIRS 5 /*为等待的顾客准备的椅子数*/
 2
 3     typedef int semaphone ; /*运用你的想象力*/
 4     semaphore customers=0; /*等待服务的顾客数*/
 5     semaphore barbers=0; /*等待顾客的理发师数*/ //[转者注:初值为0]
 6     semaphore mutex=1; /*用于互斥*/
 7     int waiting=0; /*等待的顾客(还没理发的)*/
 8
 9     void barber(void)
10     {
11         while(TRUE)
12         {
13             down(customers);
14             /*如果顾客数是0,则睡眠*/
15             down(mutex); /*要求进程等待*/
16             waiting=waiting-1; /*等待顾客数减1*/
17             up(barbers);
18             /*一个理发师现在开始理发了*/
19             up(mutex); /*释放等待*/
20             cut_hair(); /*理发(非临界区操作)*/
21         }
22     }
23
24     void customers(void)
25    {
26        down(mutex);/*进入临界区*/
27        if(waiting < CHAIRS)
28        {/*如果没有空椅子,就离开*/
29           waiting = waiting + 1;/*等待顾客数加1*/
30           up(customers);  /*如果必要的话,唤醒理发师*/
31           up(mutex); /*释放访问等待*/
32           down(barbers);/*如果barbers为0,就入睡*/
33           get_haircut();/*坐下等待服务*/
34         }
35         else
36            up(mutex);/*店里人满了,走吧*/
37     }
38        

[转] http://blog.csdn.net/sarah_jieyu/article/details/6510521

 

经典PV操作问题 [转]相关推荐

  1. 【操作系统】经典PV操作题目

    5个经典PV操作题(附答案) 三个进程之间的同步 pv操作的经典习题 PV操作题型整理 生产者和消费者 生产者消费者问题 当只有一个生产者和一个消费者的时候,且只有一个缓冲区 要考虑生产者和消费者两个 ...

  2. 【互斥同步经典PV操作】

    互斥同步经典PV操作 内容来自B站王道老师计算机考研操作系统讲解 文章目录 互斥同步经典PV操作 一.单生产者和消费者 二.多生产者和多消费者 三.吸烟问题 四.读者与写者问题 总结 一.单生产者和消 ...

  3. 操作系统9道经典PV操作

    文章目录 仓库存储 放水果 放水果2 理发师理发 吸烟者问题 面包师问题 写者优先的读者-写者问题 交通问题 共用缓冲区 仓库存储 问题描述:有一个仓库,可以存放A和B两种产品,仓库的存储空间足够大, ...

  4. 操作系统 | PV操作七大经典问题 生产者消费者 读者写者 哲学家进餐 理发师理发睡觉 和尚打水 吸烟者 吃水果

    一.生产者消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案 ...

  5. 进程同步之信号量机制(pv操作)及三个经典同步问题

    上篇博客中(进程同步之临界区域问题及Peterson算法),我们对临界区,临界资源,锁机制详细解读了下,留下了一个问题,就是锁机制只能判断临界资源是否被占用,所以他解决了互斥问题,但是他不能确定前面的 ...

  6. 最经典的关于PV操作的解释说明

    不知道各位有没有感觉,计算机方面的考试,操作系统那块似乎PV操作经常考,这一方面说明它的重要,另一方面也说明它不容易理解,出错的人很多,下面就举几个经典的例子来帮助大家学习,也与诸位同进步. 一,PV ...

  7. PV操作经典例题——吃水果

    例1:桌上有一个盘子,每次只能放一个水果,妈妈向盘中放苹果和橘子,儿子专等吃盘里的橘子,女儿专等吃盘里的苹果.只要盘子空,妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请给出他 ...

  8. 【操作系统】PV 操作经典例题---三个进程之间的同步

    问题: 总共有 读入.执行.打印 三个进程,试用PV操作描述读入B1打印B2的同步过程. 问题解读: 这个问题就是说了这样一件事:一个输入B1,被操作之后,成为B2,将B2打印.怎样用PV操作来说这件 ...

  9. PV 操作经典例题---三个进程之间的同步

    问题: 总共有 读入.执行.打印 三个进程,试用PV操作描述读入B1打印B2的同步过程. 问题解读: 这个问题就是说了这样一件事:一个输入B1,被操作之后,成为B2,将B2打印.怎样用PV操作来说这件 ...

最新文章

  1. 海口这家只收5元的理发店火了 顾客求涨价老板都不肯
  2. Spring Boot 日志管理
  3. VTK:几何对象之PlatonicSolids
  4. memcpy(cv::Mat.data,unsigned char *,320x240),保存数据失真问题解决方法
  5. Scala-Unit6-final/type关键字、样例类样例对象
  6. 20 位行业专家共话选型经验,CSDN「选型智囊团高端研讨会」圆满落幕!
  7. JavaScript中的输入输出语句
  8. 涉密文件检查工具_保密文件销毁咨询
  9. 并发 (一)——基本概念
  10. 服务器重装系统之DELL
  11. html外链视频,WordPress文章内容中插入外链视频的通用iframe方法
  12. JAVASE基础模块三十四( 菜鸡版简单登录验证模块系统IO流文件写入)
  13. centos oracle libaio哪下载,在CentOS4.5上安装Oracle10g出现的libaio-0.3.96; found Not found问题求救...
  14. 【Excel 2013 数据透视表 学习】一、创建数据透视表
  15. 中国铁路 12306 网站的高并发架构带来的思考?研究分析后,果然超牛逼…
  16. 手把手教你制作docSet文档(用于Dash或zeal)
  17. 计算机内部线有,电脑主机内部有几根线?分别叫什么?
  18. 浅谈 SAP ABAP 系统里的 ALV 输出方式实现
  19. Linux编程:多个子进程与父进程使用匿名管道读写
  20. Fiddler抓包工具使用——学习笔记(一)

热门文章

  1. 如何测试ASP.NET Core Web API
  2. [译] Security Token 生态 — 项目指南
  3. python3 安装 mysql 用pip install PyMySQL
  4. Easy Problem 7 求反数字字符串
  5. Unity3D研究院之与Android相互传递消息
  6. C#算法大全-1-Hanoi
  7. 用eclipse生成可运行jar包、启动jar包及常见错误
  8. [转载] 淘宝旺铺扶植版如何添加背景音乐
  9. 取一个字符串中的数字
  10. Gradle的安装和在idea的配置