Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void* produce (void *countert){
- for(;;){//Loop infinito para que a função seja gerida inteiramente pelas threads
- pthread_mutex_lock( &producer.mutex);//Bloqueia o mutex produtor para que mais ninguem mexa
- while(producer.elements == total_elementos); //Caso já tenham sido produzidos o nº máximo não avança daqui
- 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
- buffer_in_circ[(producer.elements % bufferInicSize)] = producer.elements +1;//Preenche o buffer temporário com o valor anterioremente adicionado + 1
- /*
- pthread_equal utiliza os IDs para comparação; pthread_self retorna o ID da thread atualmente em uso
- Os dois if's servem para verificar qual das threads está a ser usada de momento para adicionar o nº ao buffer temporário
- */
- if (pthread_equal( pthread_self(), TP_1) != 0) printf("\n TP_1 - buffer_in_circ - %d \n", buffer_in_circ[ (producer.elements % bufferInicSize) ]);
- else if (pthread_equal( pthread_self(), TP_2) != 0) printf("\n TP_2 - buffer_in_circ - %d \n", buffer_in_circ[ (producer.elements % bufferInicSize) ]);
- puts("");//espera e imprime um \n \n
- *((int *) countert) += 1; //Incrementa o contador da thread em questão (passado por argumento/parametro anteriormente)
- producer.elements++; //Incrementa o nº do elemento inserido em último
- producer.pos++; //Incrementa o último index preenchido do buffer
- pthread_cond_signal( &producer.cond); //"acorda" as threads
- pthread_mutex_unlock( &producer.mutex); //desbloqueia
- }
- return NULL;
- }
- void *consume(void *countert)
- {
- //Loop infinito para que a função seja gerida inteiramente pelas threads
- for(;;)
- {
- pthread_mutex_lock( &consumer.mutex);//Bloqueia o mutex cosumidor para que mais ninguem mexa
- while (consumer.count >= producer.elements) pthread_cond_wait(&producer.cond, &consumer.mutex); //sincroniza a cosumer com os produtores
- //Lógica de saber a qual dos buffers (par/impar) o elemento deve ser adicionado
- if (consumer.count % 2 != 0) bufferPar[consumer.count % bufferFinSize / 2] = buffer_in_circ[ consumer.count % bufferInicSize ];
- else bufferImpar[consumer.count % bufferFinSize / 2 + 1] = buffer_in_circ[ consumer.count % bufferInicSize ];
- // Mostra o último elemento inserido nos respetivos buffers
- printf("\n Called consumer: \n");
- if(bufferPar[consumer.count % bufferFinSize / 2] != 0)
- printf("\n\n\t Buffer par ultimo adicionado: %d\n\n", bufferPar[consumer.count % bufferFinSize / 2]);
- printf("\n\n\t Buffer impar ultimo adicionado: %d\n\n", bufferImpar[consumer.count % bufferFinSize / 2 + 1]);
- producer.pos--;//Decrementa a última posição preenchida do buffer temporário
- consumer.count++;// Incrementa o nº de elementos colocados nos buffers permanentes
- *((int *) countert) += 1;// Incrementa o nº de vezes que a thread atual foi executada
- 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
- if( consumer.count == total_elementos) mostrar();// Quando o consumidor consome o total de elementos propostos são mostradas as estatísticas
- pthread_mutex_unlock( &consumer.mutex);
- }
- return NULL;
- }
Advertisement
Add Comment
Please, Sign In to add comment