/*-----------------------------------------------------*/
int main(){
	pthread_t id;

	sem_init(&mutex, 0, 1);
	sem_init(&barr, 0, 0);   
	
	a = 3;

	pthread_create(&id, NULL, funcao, NULL);

	c = a + 1;

	barreira();

	d = b + c;

	c = b + d;

	barreira();


	printf("Valores finais: %d %d %d %d\n", a, b, c, d);

	sem_destroy(&mutex);
	sem_destroy(&barr);  


}
void * funcao (void * args){

	b = a;

	barreira();

	a = a + 2;	
	
	barreira();

}
Example #3
0
void * threads_integral (void* arg){
	// Descobre o pid da thread
	int* p = (int *) arg;
	int pid = * p;

	int particaoInicial,particaoFinal, i;
	double inicioIntervalo, fimIntervalo;

	//printf("-- Thread %d criada!\n", pid);

	// Enquanto o erro da iteração for maior que o erro máximo, calcula a integral mais uma vez
	while(erroIteracaoAtual > erroMaximo){
		pthread_mutex_lock(&mutex);
		// Verifica se existe alguma partição livre que alguma thread ainda não pegou
		if( nParticoesParaCalcular > 0 ){
			particaoFinal = vetorParticao[nParticoesParaCalcular - 1];
			if( nParticoesParaCalcular == 1 ){
				particaoInicial = 0;
			}else{
				particaoInicial =  vetorParticao[nParticoesParaCalcular - 2] + 1;
			}
			nParticoesParaCalcular --;
			pthread_mutex_unlock(&mutex);
			vetorIntegral[pid] = 0;	
			for(i = particaoInicial ; i <= particaoFinal; i++){ 
                inicioIntervalo = calcula_inicio_intervalo(i);
                fimIntervalo = calcula_fim_intervalo(i);

                // Descomente as linhas abaixo para ver passo a passo
                //printf("    Thread %d Inicio intervalo %f \n", pid, inicioIntervalo);
                //printf("    Thread %d Fim intervalo %f \n", pid, fimIntervalo);
                vetorIntegral[pid] += calcula_integral(inicioIntervalo, fimIntervalo);
                //printf("    Thread %d , particao %d, valor integral: %f\n", pid, i, vetorIntegral[pid]);
            }
			//printf("Thread %d calculou seu pedaço de integral!\n Sua particaoInicial foi: %d e a sua particaoFinal foi %d \n", pid,particaoInicial,particaoFinal);


		}else{
			pthread_mutex_unlock(&mutex);
			vetorIntegral[pid] = 0;

            // Descomente as linhas abaixo para ver passo a passo
			//printf("Thread %d não fez nada nessa iteração!\n", pid);
		}

		barreira(pid);
	}

	pthread_exit(NULL);
}
void * threads_integral (void* arg){
    // Descobre o pid da thread
    int* p = (int *) arg;
    int pid = * p;

    int particaoInicial,particaoFinal, i;
    double inicioIntervalo, fimIntervalo;

    // Enquanto o erro da iteração for maior que o erro máximo, calcula a integral mais uma vez
    while(erroIteracaoAtual > erroMaximo){
        pthread_mutex_lock(&mutex);
        // Verifica se existe alguma partição livre que alguma thread ainda não pegou
        if( nParticoesParaCalcular > 0 ){
            // Pega o valor da partição final do buffer de partições
            particaoFinal = vetorParticao[nParticoesParaCalcular - 1];
            // Calcula o valor da partição inicial baseada na partição final
            if( nParticoesParaCalcular == 1 ){
                particaoInicial = 0;
            }else{
                particaoInicial =  vetorParticao[nParticoesParaCalcular - 2] + 1;
            }
            // Indica que foi removido um elemento do buffer
            pthread_mutex_unlock(&mutex);
            nParticoesParaCalcular --;

            // Limpa o vetor de integrais da última iteração            
            vetorIntegral[pid] = 0;
            // Faz o cálcula da integral para cada partição e salva no vetor de integrais parciais  
            for(i = particaoInicial ; i <= particaoFinal; i++){ 
                inicioIntervalo = calcula_inicio_intervalo(i);
                fimIntervalo = calcula_fim_intervalo(i);
                vetorIntegral[pid] += calcula_integral(inicioIntervalo, fimIntervalo);
            }

        }else{
            pthread_mutex_unlock(&mutex);
            // Limpa o vetor de integrais da última iteração            
            vetorIntegral[pid] = 0;
        }

        barreira(pid);
    }

    pthread_exit(NULL);
}