操作系统 理发师问题

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>

#define SEAT_NUM  2
#define CUSTOMER_NUM  5
int waiting_room[2];
int waiting_haspeople[2];
int cutting_id;
sem_t waiting_empty, waiting_full, cutting_empty, cutting_full, has_done, mutex;
/************************************/


/************************************/

void sleep_random(int t) {
  sleep((int)(t * (rand() / (RAND_MAX *1.0))));
}

void *barber()
{
  
/************************************/
  for (int i = 0; i < 5; i++)
  {
    sem_wait(&cutting_full);

/************************************/
  printf("barber: start cutting\n");
  sleep_random(3);
  printf("barber: finish cutting\n");
/************************************/
  sem_post(&has_done);

/************************************/
  sem_post(&cutting_empty);
  }
}

void *customer(void *id)
{
  const int myid = *(int*)id;
  sleep_random(2);
  printf("customer %d: enter waiting-room\n", myid);


  sem_wait(&waiting_empty);
  sem_wait(&mutex);
  printf("customer %d: sit down\n", myid);
  sem_post(&mutex);
  sem_post(&waiting_full);


  sem_wait(&cutting_empty);
  sem_wait(&waiting_full);
  sem_wait(&mutex);
  printf("customer %d: enter cutting-room and sit down\n", myid);
  sem_post(&mutex);
  sem_post(&waiting_empty);
  sem_post(&cutting_full);


  sem_wait(&has_done);
  sem_wait(&mutex);
  printf("customer %d: bye\n", myid);
  sem_post(&mutex);
  
}

int main()
{
  int i, id[CUSTOMER_NUM];
  pthread_t t[CUSTOMER_NUM];

  srand((int)time(0));
/************************************/
  
  sem_init(&waiting_empty, 0, 2);
  sem_init(&waiting_full, 0, 0);
  sem_init(&cutting_empty, 0, 1);
  sem_init(&cutting_full, 0, 0);
  sem_init(&has_done, 0, 0);
  sem_init(&mutex, 0, 1);
/************************************/

  for (i = 0; i < CUSTOMER_NUM; i++)
  {
    id[i] = i + 1;
    pthread_create(&t[i], NULL, customer, &id[i]);
  }
  barber();
  for (i = 0; i < CUSTOMER_NUM; i++)
  {
    pthread_join(t[i], NULL);
  }
  return 0;
}

ps:这题直接点评测也能过

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值