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

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

/*基于信号量采用多线程技术实现进程同步*/

#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

}

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

问题分析

题目中要求描述理发师和顾客的行为,因此需要两类进程Barber ()和Customer()分别描述理发师和顾客的行为。当理发师看报时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师看报,因此理发师和顾客之间是同步的关系,由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n个,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。故引入3个信号量和一个控制变量:1)控制变量waiting用来记录等候理发的顾客数,初值均为0;2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0;4)信号量 mutex用于互斥,初值为1

问题实现

1.PV *** 作代码如下:

int waiting=0 ; //等候理发的顾客数

int chairs=n; //为顾客准备的椅子数

semaphore customers=0, barbers=0,mutex=1

barber()

{

while(TRUE) //理完一人,还有顾客吗?

P(cutomers) //若无顾客,理发师睡眠

P(mutex)//进程互斥

waiting := waiting – 1 //等候顾客数少一个

V(barbers) //理发师去为一个顾客理发

V(mutex)//开放临界区

cut-hair( ) //正在理发}

customer()

{

P(mutex)//进程互斥

if (waiting)

{ waiting := waiting+1 // 等候顾客数加1

V(customers) //必要的话唤醒理发师

V(mutex) //开放临界区

P(barbers) //无理发师, 顾客坐着养神

get-haircut( ) //一个顾客坐下等理/ }

else

V(mutex)//人满了,走吧!}

1首先要将分叉的部分剪去,如果不剪掉,长发的发尾还是会分叉。由分叉点向上剪掉一英寸(1英寸=2.54厘米)效果最佳。2使用完全适合自己发质且温和的洗发精,并于每次洗发后用护发素,以供给头发所需的营养。3尽量减少烫发、染发、漂发等化学处理。烫发及染发后,务必加强补给头发营养。4每天梳发,尤其是睡觉前,许多人只顾洗脸、洗澡,却忘了刷去头发上的灰尘,因为头发所沾的污垢及灰尘比身体、脸部。5进行户外活动,应做好护发的准备,能够准备一顶大帽子更好;活动结束后,应好好清洗头发,尤其是经过阳光曝晒或海水浸泡者,更应彻底滋润受损的头发。6避免受夏季太阳的强烈曝晒。7避免使用不当的洗发水。8要保证足够的睡眠时间,防止疲劳过度。9避免受海水侵蚀。10留长发者,为避免头发分叉,最好40天左右剪一次发梢,并改用含油类洗发水,适当定期焗油。11经常用鬓毛刷按摩头皮,增进血液循环,刺激油脂分泌。12每次吹风时,必须先把头发润湿,切忌在头发干燥时吹风。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8553021.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-17
下一篇 2023-04-17

发表评论

登录后才能评论

评论列表(0条)

保存