#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:这题直接点评测也能过