java用信号量写理发师_信号量实现理发师问题

本文使用Java信号量实现理发师问题,包括一个理发师、一把理发椅和多个顾客。通过信号量customers、barbers、waiting和mutex进行进程同步,确保理发店运作有序。当顾客到达时,会根据店内情况决定是否等待理发或离开。
摘要由CSDN通过智能技术生成

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

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

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

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

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

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

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

#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;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值