永发信息网

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

答案:1  悬赏:80  手机版
解决时间 2021-12-01 21:51
Linux:睡眠理发师问题(用C语言实现)
最佳答案

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#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   {
       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;
}

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

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
夜听风吹雨下一句
索尼280摄像机怎么把备用电池的提示信息关掉
修建120平方米的房子三楼一底需要材料多少钱
我的小古牧2月大,可感觉耳聋
一个乐队里三个人,乐器怎样分配。 一共有多
女人希望永远都是18岁怎么形容?
2的15次在电脑上怎么输
帮忙把,
AMD速龙II X4 860K处理器怎么样
有多少人能接受婚前发生关系的
2015年中国钢铁需求知多少
DSL灯不亮了怎么办啊?
分解因式:x4y-16y=________
每天早上称 体重波动一斤以内 正常吗?是不是
lingo软件中的模型有哪些种类?例如:LP模型
推荐资讯
奥铃二手车零八年的能卖多钱
古田三路/易农街(路口)怎么去啊,有知道地址
猫行是谁在炒作为啥掉价这么厉害
html中左右固定了大小,中间空的如何自动填满
有种工具 只要把面团放进去用手压一下面条就
求一首诗,开头是这样:爱你,不只是因为你今
到深圳龙华有经过株潭镇的长途汽车吗
炊牛馆音乐主题餐厅怎么去啊,有知道地址的么
WPS文件发送得手机上为何是乱码
FL Studio 9和FL Studio 10哪个好用
这是不是实木烤漆门?有人说照片上是表面的奥
成语什么巢而出
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?