Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2898747
  • 博文数量: 674
  • 博客积分: 17881
  • 博客等级: 上将
  • 技术积分: 4849
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 10:15
文章分类

全部博文(674)

文章存档

2013年(34)

2012年(146)

2011年(197)

2010年(297)

分类: LINUX

2011-12-26 15:34:58

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

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

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

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

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

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

  1. /* 基于信号量采用多线程技术实现进程同步*/  
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  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
  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;  
  97. }  
  98. http://blog.csdn.net/homking/article/details/5027569
阅读(2047) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~