Advertisement
Guest User

Untitled

a guest
Jun 13th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.85 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement