O problema é análogo ao de manter um barbeiro trabalhando quando existem clientes, descansando quando há nenhum e fazendo tudo isso de uma forma ordenada. O barbeiro e seus clientes podem ser representados por seus referidos processos.
A seguir, um trecho em C que pode resolver mais esse problema. O problema foi ligeiramente simplificado:
A seguir, um trecho em C que pode resolver mais esse problema. O problema foi ligeiramente simplificado:
- Supondo que apenas 25 clientes chegaram em intervalos regulares de um segundo;
- Supondo que o barbeiro leva dois segundos para fazer um corte;
- Supondo que a barbearia tem cinco cadeiras para os clientes aguardarem a vez, como ilustra a figura ao lado.
#include<semaphore.h>A seguir, um screenshot para comprovar o bom funcionamento do programa desenvolvido.
#include<pthread.h>
#include<math.h>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define CHAIRS 5
#define NUMBER_CUSTOMERS 25
#define TRUE 1
#define FALSE 0
#define NEW_CUSTOMER 1 //time between the arrival of two customers
#define HAIRCUT_TIME 2 //time to finish a haircut
sem_t customers, barbers, mutex;
int waiting = 0;
void cut_hair(){
printf("Barber is working!! %d free chair(s)\n", CHAIRS-waiting);
}
void get_haircut(int i){
printf("Customer #%d is getting a haircut!\n", i);
}
void barber(void){
while(TRUE){
sem_wait(&customers);
sem_wait(&mutex);
waiting--;
sem_post(&mutex);
sem_post(&barbers);
cut_hair();
sleep(HAIRCUT_TIME);
}
}
void customer(int i){
sem_wait(&mutex);
if(waiting<CHAIRS) {
waiting++;
sem_post(&customers);
sem_post(&mutex);
sem_wait(&barbers);
get_haircut(i);
}
else {
sem_post(&mutex);
printf("Barber shop is full! Customer #%d cannot wait!\n", i);
}
}
void* call_barber(void* arg){
barber();
}
void* call_new_customer(void* arg){
customer( (int) arg);
}
int main() {
int i;
sem_init(&customers, 0, 0);
sem_init(&barbers, 0, 1);
sem_init(&mutex, 0, 1);
pthread_t mr_barber;
pthread_create(&mr_barber, NULL, call_barber, NULL);
pthread_t customer[NUMBER_CUSTOMERS];
for (i=0; i<NUMBER_CUSTOMERS; i++) {
printf("Customer #%d arrives! %d free chair(s)\n", i, CHAIRS-waiting);
pthread_create(&customer[i], NULL, call_new_customer, (void*) i);
sleep(NEW_CUSTOMER);
}
return 0;
}
Nenhum comentário:
Postar um comentário