Simulação threads - barbeiro
#include
#include
#include
#define SEG 1000000
struct lista { int num_cliente; struct lista* proximo;
};
struct lista* plista; struct lista* ponteiro;
int num_espera;
struct thread_parms
{
int num_barbeiro;
};
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
sem_t semaforo;
void* thread_function(void *args){ int barbeiro;
while(1){ struct lista* proximo_cliente;
sem_wait(&semaforo);
pthread_mutex_lock (&mutex); num_espera--; proximo_cliente = plista; plista = plista->proximo; struct thread_parms* p = (struct thread_parms*) args; barbeiro = p->num_barbeiro;
pthread_mutex_unlock (&mutex);
printf("Barbeiro %d cortando o cabelo do cliente %d.\n", barbeiro, proximo_cliente->num_cliente); usleep(10*1000000);
free(proximo_cliente); } return NULL;
}
void inicializa(){ plista = NULL; sem_init(&semaforo, 0, 0);
}
void add_cliente(int num_cliente, int num_cadeiras_espera){
if (num_espera == num_cadeiras_espera ) printf("Cliente %d foi embora.\n", num_cliente); else{ num_espera++; struct lista* novo_cliente; novo_cliente = (struct lista*) malloc (sizeof (struct lista));
pthread_mutex_lock (&mutex); novo_cliente->num_cliente = num_cliente;
if(plista != NULL){ ponteiro = plista; while(ponteiro->proximo != NULL) ponteiro = ponteiro->proximo; ponteiro->proximo = novo_cliente; } else{ novo_cliente->proximo = plista; plista = novo_cliente; }
sem_post (&semaforo); pthread_mutex_unlock (&mutex); }
}
void chega_cliente(int *cont_cliente, int num_cadeiras_espera){ printf("Chegou o cliente %d.\n",*cont_cliente); add_cliente(*cont_cliente, num_cadeiras_espera); *cont_cliente = *cont_cliente + 1;
}
int main(int argc, char* argv[]){
int num_barbeiros = atoi(argv[1]); int num_cadeiras_espera = atoi(argv[2]); int tempo_barbeiro = atoi(argv[3]); int tempo_cliente =