SHARE
TWEET

Untitled

a guest May 19th, 2017 44 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <pthread.h>
  5. #include <unistd.h>
  6. #include <semaphore.h>
  7. #define CADEIRAS 5 /*numero de cadeiras*/
  8. #define CLIENTES 20 /*Numeros de Clientes*/
  9. #define EMBORA 20
  10.  
  11. sem_t clientes; /*semaforo para numero de clientes*/
  12. sem_t barbeiros; /*semaforo para numero de barbeiros*/
  13. sem_t mutex; /*mutex para acesso à numero de clientes esperando*/
  14. int n_espera = 0; /*numero de clientes esperando*/
  15. pthread_t t_barbeiro; /*thread para o barbeiro*/
  16. int n_cortados = 0; /*numero de cabelos cortados*/
  17. int g = -1;
  18. int embora[EMBORA];
  19. void cabelo_cortado(int i_con);
  20. void cortar_cabelo();
  21. void *barbeiro();
  22. void *consumidor(void *i_cons);
  23. int foi_embora(int numero);
  24.  
  25. int main(void){
  26.  
  27.   int res; /*variáveis para controle de loop e validação da criação de threads e semaforos*/
  28.   int j;
  29.  
  30.   void *resultado_thread[CLIENTES];
  31.   void *resultado_thread_barbeiro;
  32.   pthread_t t[CLIENTES]; /*vetor das threads dos clientes*/
  33.   int aux[CLIENTES];
  34.  
  35.  
  36.   /*criação do semáforo mutex*/
  37.   res = sem_init(&mutex, 0, 1);
  38.  
  39.   if (res!= 0 ){
  40.     perror("\nFalha na criacao de mutex");
  41.    
  42.     exit(EXIT_FAILURE);
  43.   }
  44.  
  45.   /*criação do semáfor de clientes*/
  46.   res = sem_init(&clientes, 0, 0);
  47.  
  48.   if (res!= 0 ){
  49.     perror("\nFalha na criacao do semaforo de clientes");
  50.     exit(EXIT_FAILURE);
  51.   }
  52.  
  53.   /*Iniciação da semáforo de barbeiro*/
  54.   res = sem_init(&barbeiros, 0, 0);
  55.  
  56.   if (res!= 0 ){
  57.     perror("\nFalha no semaforo de barbeiros");
  58.    
  59.     exit(EXIT_FAILURE);
  60.   }
  61.  
  62.   /*Criação da thread do barbeiro*/
  63.   res = pthread_create(&t_barbeiro, NULL, barbeiro, (void *)&j);
  64.   if (res!= 0 ){
  65.  
  66.     perror("\nFalha na criacao da thread de barbeiro");
  67.     exit(EXIT_FAILURE);
  68.   }
  69.  
  70.   /*criação das threads*/
  71.   for (j = 0 ; j < CLIENTES; j++){
  72.     aux[j] = j;
  73.     sleep(2.f); /*intervalo entre a chegada de consumdores*/
  74.     res = pthread_create(&t[aux[j]], NULL, consumidor, (void *)&aux[j]);
  75.     if (res!= 0 ){
  76.       perror("\nFalha na criacao da thread");
  77.       exit(EXIT_FAILURE);
  78.     }
  79.   }
  80.   /*join na thread do barbeiro*/
  81.   res = pthread_join(t_barbeiro, &resultado_thread_barbeiro);
  82.   if (res!= 0 ){
  83.     perror("\nFalha no thread join");
  84.     exit(EXIT_FAILURE);
  85.   }
  86.    
  87.   /*join nas threads de clientes*/
  88.   for (j = 0 ; j<CLIENTES; j++){
  89.     res = pthread_join(t[j], &resultado_thread[j]);
  90.     if (res!= 0 ){
  91.       perror("\nFalha no thread join do consumidor");
  92.       exit(EXIT_FAILURE);
  93.      }
  94.   }
  95.   pthread_exit(NULL);
  96.   return 0;
  97. }
  98.  
  99. /*função da thread do barbeiro*/
  100. void *barbeiro(){
  101.  
  102.   while(1) {
  103.     sem_wait(&clientes); /*dorme se clientes for 0*/
  104.     sem_wait(&mutex); /*pega acesso ao numero de clientes esperando*/
  105.     n_espera = n_espera + (-1); /*decrementa clientes*/
  106.    
  107.     sem_post(&barbeiros); /*o barbeiro está livre*/
  108.     sem_post(&mutex); /*libera o acesso ao numero de clientes esperando*/
  109.     cortar_cabelo(); /*corta o cabelo*/
  110.   }
  111.  
  112.   pthread_exit("exit from thread");
  113. }
  114.  
  115. void *consumidor(void *i_con){
  116.   int i = *(int *)i_con;
  117.   sem_wait(&mutex); /*pega acesso exclusivo ào numero de clientes esperando*/
  118.  
  119.   if(n_espera < CADEIRAS) { /*verifica se tem cadeiras vagas*/
  120.     n_espera = n_espera + 1; /*entra e incrementa numero de clientes esperando*/
  121.     printf("\nConsumidor %d entra na barbearia", i+1);
  122.     sem_post(&clientes); /*acorda barbeiro se necessário*/
  123.     sem_post(&mutex); /*libera acesso exclusivo à numero de clientes esperando*/
  124.    
  125.     sem_wait(&barbeiros); /*dorme se o barbeiro não está disponivel*/
  126.     cabelo_cortado(i); /*se levanta e corta o cabelo*/
  127.   }
  128.   else{
  129.     printf("\nConsumidor %d viu que estava cheiro e foi embora", i+1);
  130.     g++;
  131.     embora[g] = i+1;
  132.     sem_post(&mutex); /*se não possui espaço vai embroa*/
  133.   }
  134.   pthread_exit("exit from thread");
  135. }
  136.  
  137. void cabelo_cortado(int i_con){
  138.   printf("\nConsumidor %d foi cortar o cabelo", i_con+1);
  139. }
  140.  
  141. void cortar_cabelo(){
  142.   int i;
  143.   /*n_cortados++;*/
  144.   sleep(3.f);
  145.   /*printf("\nBarbeiro terminou corte de cabelo n %d", n_cortados);*/
  146.   if(g != -1)
  147.     i = foi_embora(n_cortados+1);
  148.   else
  149.     i = 0;
  150.  
  151.   printf("\nBarbeiro termina o corte do cliente numero %d", n_cortados + i + 1);
  152.   n_cortados++;
  153. }
  154.  
  155. int foi_embora(int numero){
  156.   int i;
  157.   for(i=0; i<g; i++)
  158.     if(embora[i] == numero)
  159.       return g;
  160.    
  161.   return 0;
  162. }
RAW Paste Data
Top