barber

理发店里有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子。如果没有顾客,理发师在理发椅上睡觉。一个顾客来到时,叫醒理发师,如果理发师正在理发时有顾客到来,则如果有空椅子可以坐,就坐下来等待,否则离开。

      利用三个信号量和一个控制变量来协调理发师、理发椅和顾客之间的活动。

  1.信号量customers 用来记录等候理发的顾客数,并用坐阻塞理发师进程,初值为0

  2.信号量barbers 记录正在等候顾客的理发师数

  3.信号量waiting 用来记录等候理发的顾客数

  4.信号量mutex 用于互斥,初值为1

  1. /*基于信号量采用多线程技术实现进程同步*/  
  2. #include <pthread.h>  
  3. #include <stdio.h>  
  4. #include <unistd.h>  
  5. #include <stdlib.h>  
  6. #include <semaphore.h>  
  7. #include <sys/time.h>  
  8. #include <math.h>  
  9. #define CHAIRS 5 //椅子数  
  10. sem_t customers; //等待服务的顾客信号量  
  11. sem_t barbers;  //等待顾客的理发师信号量  
  12. pthread_mutex_t mutex; //互斥变量  
  13. int waiting = 0; //正在等待的顾客数  
  14. void *barber(void *arg);  
  15. void *customer(void *num);  
  16. void cut_hair(void);  
  17. double timediff(struct timeval i,struct timeval j);  
  18. void seed_random(void);  
  19. double flat(void);  
  20. double normal(void);  
  21. double bursty(void);  
  22. int main()  
  23. {  
  24.    int i;  
  25.    seed_random();  
  26.    pthread_t barber_t,customer_t;  
  27.    int error;  
  28.    error=pthread_create(&barber_t,NULL,barber,NULL);//创建理发师线程  
  29.    if(error!=0) {  
  30.       printf("pthread_create is not created.../n");  
  31.       return -1;  
  32.    }  
  33.    while(1) {  
  34.       usleep(30000);//等待时间如果小于理发师理发时间则会出现等待者过多,否则不会出现等待者过多的现象  
  35.       error=pthread_create(&customer_t,NULL,customer,NULL);//创建顾客线程  
  36.       if(error!=0) {  
  37.          printf("pthread_create is not created.../n");  
  38.          return -1;  
  39.       }  
  40.    }  
  41. }  
  42. double timediff(struct timeval now,struct timeval earlier)  
  43. {  
  44.    if(now.tv_sec == earlier.tv_sec)  
  45.       return (now.tv_usec - earlier.tv_usec)/1000000.0;  
  46.    else  
  47.       return (1000000*(now.tv_sec - earlier.tv_sec) + now.tv_usec - earlier.tv_usec)/1000000.0;  
  48. }  
  49. void *barber(void *arg)  
  50. {  
  51.    while(1)  
  52.    {  
  53.       sem_wait(&customers);//顾客信号量-1  
  54.       pthread_mutex_lock(&mutex);  
  55.       waiting = waiting -1;  
  56.       sem_post(&barbers);//  
  57.       pthread_mutex_unlock(&mutex);  
  58.       cut_hair();//理发  
  59.    }  
  60. }  
  61. void cut_hair(void)  
  62. {  
  63.    printf("  Barber:I am cutting the customer's hair.../n");  
  64.    usleep(100000);//理发时间  
  65.    printf("  Barber:done./n");  
  66. }  
  67. void *customer(void *num)  
  68. {  
  69.    pthread_mutex_lock(&mutex);  
  70.    if(waiting<CHAIRS)  
  71.    {  
  72.        waiting = waiting + 1;  
  73.        sem_post(&customers);  
  74.        pthread_mutex_unlock(&mutex);  
  75.        sem_wait(&barbers);   
  76.    }  
  77.    else  
  78.    {  
  79.       printf("  Waiter is too much.../n");  
  80.       pthread_mutex_unlock(&mutex);  
  81.    }  
  82.    //释放占用的资源  
  83. }  
  84. void seed_random(void)  
  85. {  
  86.    struct timeval randtime;  
  87.    unsigned short xsub1[3];  
  88.    gettimeofday(&randtime,(struct timezone *)0);  
  89.    xsub1[0] = (ushort)randtime.tv_usec;  
  90.    xsub1[1] = (ushort)(randtime.tv_usec >> 16);  
  91.    xsub1[2] = (ushort)(getpid());  
  92.    seed48(xsub1);  
  93. }  
  94. double flat()  
  95. {  
  96.    return drand48()/5;  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值