void barber() { while(true) { sem_wait(customer_waiting); cut_hair(); sem_signal(barber_sleeping); } }
static void * machine(void *arg) { int id; pthread_mutex_lock(&mut); id = machine_id++; pthread_mutex_unlock(&mut); printf("Peluquero %d: creado\n", id); while ( 1 ) { int n; pthread_mutex_lock(&mut); /* Si hay algĂșn cliente esperando, despertarlo */ while ( !(n = get_client()) ) { /* Si no, a dormir */ printf("Peluquero %d: esperando cliente\n", id); pthread_cond_wait(&clients_waiting, &mut); } pthread_mutex_unlock(&mut); /* Cortar el pelo */ cut_hair(id, n); } return NULL; }
void barber() { while(true) { sem_wait(customer_waiting); sem_wait(seats_mutex); free_seats++; cut_hair(); sem_signal(barber_sleeping); sem_signal(seats_mutex); } }
void *barber_thread(void *arg) { for (;;) { sem_wait(&customer); printf("%s\n", "Barber: Next customer!"); printf("%s\n", "Barber: Good morning, sir"); sem_post(&barber); cut_hair(); sem_wait(&customer_done); printf("%s\n", "Barber: Very funny sir!"); sem_post(&barber_done); printf("%s\n", "Barber: You're done!"); } }
/* Thread defining Barber's behavior */ void* thread_barber (void* param) { struct shop_data* shop; struct barber_data* barber; void(*cut_hair)(int min, int max); shop = (struct shop_data*)param; barber = shop->barber; cut_hair = sleep_within; while (!shop->empty) { printf("Barber -- sleeping\n"); sem_wait(&barber->awake); printf("Barber -- cuttting hair\n"); cut_hair(MIN_TIME, MAX_TIME); sem_post(&barber->done_cutting); } }
main () { pid_t child; int i; int nop=0; mutexid = semget(IPC_PRIVATE, 1, SEM_MODE); customers = semget(IPC_PRIVATE, 1, SEM_MODE); barbers = semget(IPC_PRIVATE, 1, SEM_MODE); if( (mutexid == -1) || (customers == -1) || (barbers == -1)) printf("semget error"); initial_value.val = 1; if( semctl(mutexid, 0, SETVAL, initial_value) == -1) printf("semctl error \n"); initial_value.val = 0; if( semctl(customers, 0, SETVAL, initial_value) == -1) printf("semctl error \n"); initial_value.val = 0; if( semctl(barbers, 0, SETVAL, initial_value) == -1) printf("semctl error \n"); if( (child = fork() ) < 0) { printf("fork error"); } if(child){ // child acts as producer for(i=1; i <= CUS_NUM; i++){ usleep(10000); printf("A Customer has Entered the store \n"); down(mutexid); if(waiting<waitingchairs){ waiting=waiting+1; up(customers); printf("Customer is waiting \n"); up(mutexid); down(barbers); }//endif else { up(mutexid); left=left+1; printf("Customer Left the shop \n"); } } //endfor }//end Child Process else { for(i=1; i<CUS_NUM; i++) { down(customers); down(mutexid); waiting=waiting-1; up(barbers); up(mutexid); cut_hair(); }//endwhile printf("Customers who left %d",left); if(semctl(mutexid, 0, IPC_RMID, nop) == -1) printf("semctl error"); if(semctl(customers, 0, IPC_RMID, nop) == -1) printf("semctl error"); if(semctl(barbers, 0, IPC_RMID, nop) == -1) printf("semctl error"); } return(EXIT_SUCCESS); } //End of main