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;  



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章