daily pastebin goal
18%
SHARE
TWEET

Untitled

a guest Jun 13th, 2018 64 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <pthread.h>
  5. #include <time.h>
  6. #include <unistd.h>
  7. #include <semaphore.h>
  8. #include <math.h>
  9. //gcc -o t3 semaforo.c -pthread
  10.  
  11. sem_t aten_sem;
  12. sem_t atenfull_sem;
  13.  
  14. typedef struct{
  15.     int    idThread;
  16.     int*   buffer;
  17.     int    tam_buffer;
  18. } args;
  19.  
  20. int novo_cliente(){
  21.     int resultado;
  22.     resultado = rand()%10;
  23.     if(resultado > 4)
  24.         resultado = 1;
  25.     else
  26.         resultado = 0;
  27.     return resultado;
  28. }
  29.  
  30. int tempo_chamada(){
  31.     int resultado;
  32.     resultado = rand()%10;
  33.     if(resultado > 6)
  34.         resultado = 1;
  35.     else
  36.         resultado = 0;
  37.     return resultado;
  38. }
  39.  
  40. int limpa_linha(int *buffer, int tam){
  41.     int i;
  42.     for(i = 0; i < tam; i++){
  43.         buffer[i] = -1;
  44.     }
  45.  
  46. }
  47.  
  48. int verifica_linha(int *buffer, int tam){
  49.     int i, cheio;
  50.     cheio = 0;
  51.     for(i = 0; i < tam; i++){
  52.         if(buffer[i] != -1) //verifica se tem algm na linha de espera, e ja retorna quantos tem
  53.             cheio++;
  54.     }
  55.     return cheio;
  56. }
  57.  
  58. void print_buffer(int *buffer, int tam){
  59.     int i;
  60.     printf("Buffer : ");
  61.     for(i = 0; i < tam; i++){
  62.         if(buffer[i] != -1) //verifica se tem algm na linha de espera, e ja retorna quantos tem
  63.             printf("[%d] ", buffer[i]);
  64.         else
  65.             printf("[X] ");
  66.     }
  67.     printf("\n");
  68. }
  69.  
  70. void insere_linha(int *buffer, int tam, int id){
  71.     int i, ok;
  72.     i = ok = 0;
  73.     do {
  74.         if(buffer[i] == -1){
  75.             buffer[i] = id;
  76.             ok = 1;
  77.         }
  78.         i++;
  79.     } while((i < tam) && (ok != 1 ));
  80.  
  81. }
  82.  
  83. void retira_linha(int *buffer, int tam, int id){
  84.     int i, ok;
  85.     i;
  86.     for(i = 0; i < tam; i++){
  87.         if(buffer[i] == id) //verifica se tem algm na linha de espera, e ja retorna quantos tem
  88.             buffer[i] = -1;
  89.     }
  90. }
  91.  
  92.  
  93. void atendente(void *arg){
  94.     args *vargs = (args *) arg;
  95.     int linha;
  96.     printf("-----------------------------------------------------------------------------------------\n");
  97.     printf("\t\tCall center do Grisotti ( Numero de linhas de espera: %d )\n", vargs->tam_buffer);
  98.     printf("-----------------------------------------------------------------------------------------\n");
  99.     while(1){
  100.         sem_wait(&atenfull_sem);
  101.         linha = verifica_linha(vargs->buffer, vargs->tam_buffer);
  102.         printf("Atendente esta falando com algum cliente! Ha %d chamadas em espera\n\n", linha-1);
  103.         do {
  104.             sleep(2);
  105.         } while(tempo_chamada());
  106.         sem_post(&aten_sem);
  107.     }
  108.     pthread_exit(NULL);
  109. }
  110.  
  111. void cliente(void *arg){
  112.     args *vargs = (args *) arg;
  113.     int linha, quit = 0;
  114.     while(!quit){
  115.         linha = verifica_linha(vargs->buffer, vargs->tam_buffer);
  116.         print_buffer(vargs->buffer, vargs->tam_buffer);
  117.         if(linha == vargs->tam_buffer){
  118.             printf("Cliente %d nao consegue realizar a chamada. Todas as linhas ocupadas\n", vargs->idThread);
  119.         }else{
  120.             printf("Cliente %d esta ligando. Havia %d chamadas em espera\n\n", vargs->idThread, linha);
  121.            
  122.             insere_linha(vargs->buffer, vargs->tam_buffer, vargs->idThread);
  123.             sem_post(&atenfull_sem);
  124.  
  125.             sem_wait(&aten_sem);
  126.             retira_linha(vargs->buffer, vargs->tam_buffer, vargs->idThread);
  127.             linha = verifica_linha(vargs->buffer, vargs->tam_buffer);
  128.             print_buffer(vargs->buffer, vargs->tam_buffer);
  129.             printf("cliente %d sendo atendido. Ha %d chamadas em espera\n\n", vargs->idThread, linha);
  130.         }
  131.         quit = 1;
  132.     }
  133.     pthread_exit(NULL);
  134.  
  135. }
  136.  
  137. int main(int argc, char *argv[]){
  138.  
  139.     int i, num_linhas, id_thread, tamanho_buffer;
  140.     int *buffer;
  141.     args *arg;
  142.     srand(time(NULL));
  143.     if(argc < 2){
  144.         printf("Faltou os argumentos\n");
  145.         return 0;
  146.     }
  147.     num_linhas = atoi(argv[1]);
  148.     if(num_linhas <= 0){
  149.         printf("Digite um numero valido para a linha de espera\n");
  150.         return 0;
  151.     }
  152.  
  153.     pthread_t tid;
  154.     buffer = (int*)malloc(num_linhas*sizeof(int));
  155.  
  156.     sem_init(&aten_sem, 0, 1);
  157.     sem_init(&atenfull_sem, 0, 0);
  158.     limpa_linha(buffer, num_linhas);
  159.  
  160.     for(id_thread = 0;;i++){
  161.  
  162.         arg = malloc(sizeof(args));
  163.         arg->buffer = buffer;
  164.         arg->idThread = id_thread;
  165.         arg->tam_buffer = num_linhas;
  166.         if(id_thread == 0){
  167.             if (pthread_create(&tid, NULL, (void*) atendente, (void*) arg)) {
  168.                 printf("\nerro ao criar thread atendente\n");
  169.                 exit(-1);
  170.             }
  171.             id_thread++;
  172.         }
  173.         else if(novo_cliente()){
  174.             if (pthread_create(&tid, NULL, (void*) cliente, (void*) arg)) {
  175.                 printf("\nerro ao criar thread cliente\n");
  176.                 exit(-1);
  177.             }
  178.             id_thread++;
  179.         }
  180.         sleep(1);
  181.     }
  182.  
  183. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top