Tugamars_PT

Untitled

Jun 13th, 2019
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.64 KB | None | 0 0
  1. void* produce (void *countert){
  2. for(;;){//Loop infinito para que a função seja gerida inteiramente pelas threads
  3. pthread_mutex_lock( &producer.mutex);//Bloqueia o mutex produtor para que mais ninguem mexa
  4. while(producer.elements == total_elementos); //Caso já tenham sido produzidos o nº máximo não avança daqui
  5. while(producer.pos == bufferInicSize -1) pthread_cond_signal(&consumer.cond); //Quando atinge o tamanho maximo do buffer temporário (60) desbloqueia pelo menos uma das threads bloqueadas pela condição do consumer
  6. buffer_in_circ[(producer.elements % bufferInicSize)] = producer.elements +1;//Preenche o buffer temporário com o valor anterioremente adicionado + 1
  7.  
  8. /*
  9. pthread_equal utiliza os IDs para comparação; pthread_self retorna o ID da thread atualmente em uso
  10. Os dois if's servem para verificar qual das threads está a ser usada de momento para adicionar o nº ao buffer temporário
  11. */
  12. if (pthread_equal( pthread_self(), TP_1) != 0) printf("\n TP_1 - buffer_in_circ - %d \n", buffer_in_circ[ (producer.elements % bufferInicSize) ]);
  13. else if (pthread_equal( pthread_self(), TP_2) != 0) printf("\n TP_2 - buffer_in_circ - %d \n", buffer_in_circ[ (producer.elements % bufferInicSize) ]);
  14.  
  15. puts("");//espera e imprime um \n \n
  16.  
  17. *((int *) countert) += 1; //Incrementa o contador da thread em questão (passado por argumento/parametro anteriormente)
  18. producer.elements++; //Incrementa o nº do elemento inserido em último
  19. producer.pos++; //Incrementa o último index preenchido do buffer
  20. pthread_cond_signal( &producer.cond); //"acorda" as threads
  21. pthread_mutex_unlock( &producer.mutex); //desbloqueia
  22. }
  23. return NULL;
  24. }
  25.  
  26. void *consume(void *countert)
  27. {
  28. //Loop infinito para que a função seja gerida inteiramente pelas threads
  29. for(;;)
  30. {
  31. pthread_mutex_lock( &consumer.mutex);//Bloqueia o mutex cosumidor para que mais ninguem mexa
  32.  
  33. while (consumer.count >= producer.elements) pthread_cond_wait(&producer.cond, &consumer.mutex); //sincroniza a cosumer com os produtores
  34.  
  35. //Lógica de saber a qual dos buffers (par/impar) o elemento deve ser adicionado
  36. if (consumer.count % 2 != 0) bufferPar[consumer.count % bufferFinSize / 2] = buffer_in_circ[ consumer.count % bufferInicSize ];
  37. else bufferImpar[consumer.count % bufferFinSize / 2 + 1] = buffer_in_circ[ consumer.count % bufferInicSize ];
  38.  
  39. // Mostra o último elemento inserido nos respetivos buffers
  40. printf("\n Called consumer: \n");
  41. if(bufferPar[consumer.count % bufferFinSize / 2] != 0)
  42. printf("\n\n\t Buffer par ultimo adicionado: %d\n\n", bufferPar[consumer.count % bufferFinSize / 2]);
  43. printf("\n\n\t Buffer impar ultimo adicionado: %d\n\n", bufferImpar[consumer.count % bufferFinSize / 2 + 1]);
  44.  
  45. producer.pos--;//Decrementa a última posição preenchida do buffer temporário
  46. consumer.count++;// Incrementa o nº de elementos colocados nos buffers permanentes
  47. *((int *) countert) += 1;// Incrementa o nº de vezes que a thread atual foi executada
  48.  
  49. if( (consumer.count % bufferInicSize) == 0) consumer.laps++;// condição que conta as voltas, (count % buffer)==0 significa que já foram retirados do buffer temporário todos os elementos
  50. if( consumer.count == total_elementos) mostrar();// Quando o consumidor consome o total de elementos propostos são mostradas as estatísticas
  51.  
  52. pthread_mutex_unlock( &consumer.mutex);
  53. }
  54. return NULL;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment