Linux:睡眠理发师问题(用C语言实现)

目的:了解信号量机制,了解并掌握进程同步和互斥机制,熟悉信号量的操作函数,利用信号量实现对共享资源的控制。设计要求:(1)编写程序实现理发师与顾客进程的同步。问题描述:这... 目的:了解信号量机制,了解并掌握进程同步和互斥机制,熟悉信号量的操作函数,利用信号量实现对共享资源的控制。
设计要求:
(1)编写程序实现理发师与顾客进程的同步。
问题描述:这是一种经典的IPC问题,理发店有一位理发师,一把理发椅和n把用来等候理发的椅子。如果没有顾客,则理发师在理发椅上睡觉,顾客理来时,如理发师闲则理发,否则如有空椅则坐等,没有空椅则离开,编写程序实现理发师和顾客程序,实现进程控制,要求不能出现竞争。
(2)将(1)题中问题修改为有两位理发师,设计程序实现同步控制。
问题提示:可以用一个变量waitting来记录等候理发的顾客数,另使用三个信号量:用来记录等候理发的顾客数customers;用来记录理发师是否空闲的信号量barbers,一个用于互斥访问waitting变量的mutex.。
系统是Ubuntu,急求答案,谢谢!
展开
 我来答
军昊韦0el95b
2015-06-30 · TA获得超过624个赞
知道小有建树答主
回答量:443
采纳率:50%
帮助的人:376万
展开全部
/*基于信号量采用多线程技术实现进程同步*/
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <semaphore.h>
#include <sys/time.h>
#include <math.h>
#define CHAIRS 5 //椅子数
sem_t customers; //等待服务的顾客信号量
sem_t barbers;  //等待顾客的理发师信号量
pthread_mutex_t mutex; //互斥变量
int waiting = 0; //正在等待的顾客数
void *barber(void *arg);
void *customer(void *num);
void cut_hair(void);
double timediff(struct timeval i,struct timeval j);
void seed_random(void);
double flat(void);
double normal(void);
double bursty(void);
int main()
{
   int i;
   seed_random();
   pthread_t barber_t,customer_t;
   int error;
   error=pthread_create(&barber_t,NULL,barber,NULL);//创建理发师线程
   if(error!=0) {
      printf("pthread_create is not created.../n");
      return -1;
   }
   while(1) {
      usleep(30000);//等待时间如果小于理发师理发时间则会出现等待者过多,否则不会出现等待者过多的现象
      error=pthread_create(&customer_t,NULL,customer,NULL);//创建顾客线程
      if(error!=0) {
         printf("pthread_create is not created.../n");
         return -1;
      }
   }
}
double timediff(struct timeval now,struct timeval earlier)
{
   if(now.tv_sec == earlier.tv_sec)
      return (now.tv_usec - earlier.tv_usec)/1000000.0;
   else
      return (1000000*(now.tv_sec - earlier.tv_sec) + now.tv_usec - earlier.tv_usec)/1000000.0;
}
void *barber(void *arg)
{
   while(1)
   {
      sem_wait(&customers);//顾客信号量-1
      pthread_mutex_lock(&mutex);
      waiting = waiting -1;
      sem_post(&barbers);//
      pthread_mutex_unlock(&mutex);
      cut_hair();//理发
   }
}
void cut_hair(void)
{
   printf("  Barber:I am cutting the customer's hair.../n");
   usleep(100000);//理发时间
   printf("  Barber:done./n");
}
void *customer(void *num)
{
   pthread_mutex_lock(&mutex);
   if(waiting<CHAIRS)
   {
       waiting = waiting + 1;
       sem_post(&customers);
       pthread_mutex_unlock(&mutex);
       sem_wait(&barbers); 
   }
   else
   {
      printf("  Waiter is too much.../n");
      pthread_mutex_unlock(&mutex);
   }
   //释放占用的资源
}
void seed_random(void)
{
   struct timeval randtime;
   unsigned short xsub1[3];
   gettimeofday(&randtime,(struct timezone *)0);
   xsub1[0] = (ushort)randtime.tv_usec;
   xsub1[1] = (ushort)(randtime.tv_usec >> 16);
   xsub1[2] = (ushort)(getpid());
   seed48(xsub1);
}
double flat()
{
   return drand48()/5;
}

第二问 加个理发师忙碌数量 用来判断 即可

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式