Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <pthread.h>
- #include <unistd.h>
- #include <semaphore.h>
- #define CADEIRAS 5 /*numero de cadeiras*/
- #define CLIENTES 20 /*Numeros de Clientes*/
- #define EMBORA 20
- sem_t clientes; /*semaforo para numero de clientes*/
- sem_t barbeiros; /*semaforo para numero de barbeiros*/
- sem_t mutex; /*mutex para acesso à numero de clientes esperando*/
- int n_espera = 0; /*numero de clientes esperando*/
- pthread_t t_barbeiro; /*thread para o barbeiro*/
- int n_cortados = 0; /*numero de cabelos cortados*/
- int g = -1;
- int embora[EMBORA];
- void cabelo_cortado(int i_con);
- void cortar_cabelo();
- void *barbeiro();
- void *consumidor(void *i_cons);
- int foi_embora(int numero);
- int main(void){
- int res; /*variáveis para controle de loop e validação da criação de threads e semaforos*/
- int j;
- void *resultado_thread[CLIENTES];
- void *resultado_thread_barbeiro;
- pthread_t t[CLIENTES]; /*vetor das threads dos clientes*/
- int aux[CLIENTES];
- /*criação do semáforo mutex*/
- res = sem_init(&mutex, 0, 1);
- if (res!= 0 ){
- perror("\nFalha na criacao de mutex");
- exit(EXIT_FAILURE);
- }
- /*criação do semáfor de clientes*/
- res = sem_init(&clientes, 0, 0);
- if (res!= 0 ){
- perror("\nFalha na criacao do semaforo de clientes");
- exit(EXIT_FAILURE);
- }
- /*Iniciação da semáforo de barbeiro*/
- res = sem_init(&barbeiros, 0, 0);
- if (res!= 0 ){
- perror("\nFalha no semaforo de barbeiros");
- exit(EXIT_FAILURE);
- }
- /*Criação da thread do barbeiro*/
- res = pthread_create(&t_barbeiro, NULL, barbeiro, (void *)&j);
- if (res!= 0 ){
- perror("\nFalha na criacao da thread de barbeiro");
- exit(EXIT_FAILURE);
- }
- /*criação das threads*/
- for (j = 0 ; j < CLIENTES; j++){
- aux[j] = j;
- sleep(2.f); /*intervalo entre a chegada de consumdores*/
- res = pthread_create(&t[aux[j]], NULL, consumidor, (void *)&aux[j]);
- if (res!= 0 ){
- perror("\nFalha na criacao da thread");
- exit(EXIT_FAILURE);
- }
- }
- /*join na thread do barbeiro*/
- res = pthread_join(t_barbeiro, &resultado_thread_barbeiro);
- if (res!= 0 ){
- perror("\nFalha no thread join");
- exit(EXIT_FAILURE);
- }
- /*join nas threads de clientes*/
- for (j = 0 ; j<CLIENTES; j++){
- res = pthread_join(t[j], &resultado_thread[j]);
- if (res!= 0 ){
- perror("\nFalha no thread join do consumidor");
- exit(EXIT_FAILURE);
- }
- }
- pthread_exit(NULL);
- return 0;
- }
- /*função da thread do barbeiro*/
- void *barbeiro(){
- while(1) {
- sem_wait(&clientes); /*dorme se clientes for 0*/
- sem_wait(&mutex); /*pega acesso ao numero de clientes esperando*/
- n_espera = n_espera + (-1); /*decrementa clientes*/
- sem_post(&barbeiros); /*o barbeiro está livre*/
- sem_post(&mutex); /*libera o acesso ao numero de clientes esperando*/
- cortar_cabelo(); /*corta o cabelo*/
- }
- pthread_exit("exit from thread");
- }
- void *consumidor(void *i_con){
- int i = *(int *)i_con;
- sem_wait(&mutex); /*pega acesso exclusivo ào numero de clientes esperando*/
- if(n_espera < CADEIRAS) { /*verifica se tem cadeiras vagas*/
- n_espera = n_espera + 1; /*entra e incrementa numero de clientes esperando*/
- printf("\nConsumidor %d entra na barbearia", i+1);
- sem_post(&clientes); /*acorda barbeiro se necessário*/
- sem_post(&mutex); /*libera acesso exclusivo à numero de clientes esperando*/
- sem_wait(&barbeiros); /*dorme se o barbeiro não está disponivel*/
- cabelo_cortado(i); /*se levanta e corta o cabelo*/
- }
- else{
- printf("\nConsumidor %d viu que estava cheiro e foi embora", i+1);
- g++;
- embora[g] = i+1;
- sem_post(&mutex); /*se não possui espaço vai embroa*/
- }
- pthread_exit("exit from thread");
- }
- void cabelo_cortado(int i_con){
- printf("\nConsumidor %d foi cortar o cabelo", i_con+1);
- }
- void cortar_cabelo(){
- int i;
- /*n_cortados++;*/
- sleep(3.f);
- /*printf("\nBarbeiro terminou corte de cabelo n %d", n_cortados);*/
- if(g != -1)
- i = foi_embora(n_cortados+1);
- else
- i = 0;
- printf("\nBarbeiro termina o corte do cliente numero %d", n_cortados + i + 1);
- n_cortados++;
- }
- int foi_embora(int numero){
- int i;
- for(i=0; i<g; i++)
- if(embora[i] == numero)
- return g;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement