zoukankan      html  css  js  c++  java
  • 经典PV操作问题 [转]

    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

     

     

     

  • 相关阅读:
    Java 基础
    Java 数据类型
    Spring 拦截器实现事物
    SSH 配置日记
    Hibernate 知识提高
    Jsp、Servlet
    leetcode 97. Interleaving String
    leetcode 750. Number Of Corner Rectangles
    leetcode 748. Shortest Completing Word
    leetcode 746. Min Cost Climbing Stairs
  • 原文地址:https://www.cnblogs.com/longdouhzt/p/2755025.html
Copyright © 2011-2022 走看看