9 // The maximum number of customer threads.
10 #define MAX_CUSTOMERS 10
12 // Define the semaphores.
18 // Flag to stop the barber thread when all customers have been serviced.
22 static void *customer(void *number) {
23 int num = *(int *)number;
25 if(DEBUG) printf("Customer %d leaving for barber shop.\n", num);
26 if(DEBUG) printf("Customer %d arrived at barber shop.\n", num);
28 sem_wait(&waitingRoom);
30 if(DEBUG) printf("Customer %d entering waiting room.\n", num);
32 sem_wait(&barberChair);
34 if(DEBUG) printf("Customer %d waking the barber.\n", num);
35 sem_post(&barberPillow);
39 sem_post(&barberChair);
40 if(DEBUG) printf("Customer %d leaving barber shop.\n", num);
44 static void *barber(void *junk) {
46 if(DEBUG) printf("The barber is sleeping\n");
47 sem_wait(&barberPillow);
50 if(DEBUG) printf("The barber is cutting hair\n");
51 if(DEBUG) printf("The barber has finished cutting hair.\n");
55 if(DEBUG) printf("The barber is going home for the day.\n");
61 int main(int argc, char *argv[]) {
63 printf("Usage: %s numCustomers numChairs RandSeed DEBUG\n", argv[0]);
68 pthread_t tid[MAX_CUSTOMERS];
69 int i, numCustomers, numChairs;
71 int Number[MAX_CUSTOMERS];
73 numCustomers = atoi(argv[1]);
74 numChairs = atoi(argv[2]);
75 RandSeed = atol(argv[3]);
76 DEBUG = atoi(argv[4]);
78 if (numCustomers > MAX_CUSTOMERS) {
79 printf("The maximum number of Customers is %d.\n", MAX_CUSTOMERS);
85 for (i=0; i<MAX_CUSTOMERS; i++) {
89 sem_init(&waitingRoom, 0, numChairs);
90 sem_init(&barberChair, 0, 1);
91 sem_init(&barberPillow, 0, 0);
92 sem_init(&seatBelt, 0, 0);
94 pthread_create(&btid, NULL, barber, NULL);
96 for (i=0; i<numCustomers; i++) {
97 pthread_create(&tid[i], NULL, customer, (void *)&Number[i]);
100 for (i=0; i<numCustomers; i++) {
101 pthread_join(tid[i],NULL);
105 sem_post(&barberPillow);
106 pthread_join(btid,NULL);