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

     

     

     

  • 相关阅读:
    go里面redis缓存池
    go语言操作redis
    goredis的操作
    go安装redis扩展
    go协程聊天室
    go里面os包的使用案例
    用php入门网络编程
    使用go里面实现了一个并发的时钟服务器
    案例一:协程创建和使用
    系统工程笔记
  • 原文地址:https://www.cnblogs.com/longdouhzt/p/2755025.html
Copyright © 2011-2022 走看看