1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Como alternar entre duas Threads na linguagem C (série de Fibonacci)?

Olá pessoal, me foi passado um problema envolvendo threads que deve ser resolvido utilizando-se a linguagem C. Na verdade o programa consiste em imprimir os valores da série de Fibonacci, de acordo com o intervalo inserido pelo usuário, utilizando-se duas threads, sendo que essas threads devem ficar se alternando, cada uma executando a função e imprimindo um valor da sequência. O problema que eu estou enfrentando é que apenas uma das threads imprime a sequência e a segunda não faz nada. Segue o código do que eu tentei fazer:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

int n;
int i = 0; 
int auxiliar;
int a = 0;
int b = 1;
pthread_t tid[2];
pthread_mutex_t lock;

void* fibonacci(void *arg){
    for (i; i < n; i++){
        pthread_mutex_lock(&lock);
        auxiliar = a + b;
        a = b;
        b = auxiliar;
        printf("Feito pela thread %u.\n", (unsigned int)pthread_self());
        printf("%d\n", auxiliar);
        pthread_mutex_unlock(&lock);
    }
}

int main(void){
    printf("Insira um número: ");
    scanf("%d", &n);
    fflush(stdin);
    int create1;
    int create2;
    create1 = pthread_create(&(tid[0]), NULL, fibonacci, NULL);
    if (create1 != 0){
        printf("Erro ao criar a thread: [%d]", strerror(create1));
    }
    pthread_join(tid[0], NULL);
    create2 = pthread_create(&(tid[1]), NULL, fibonacci, NULL);
    if (create2 != 0){
        printf("Erro ao criar a thread: [%d]", strerror(create2));
    }
    pthread_join(tid[1], NULL);
    return 0;
}

Em outro código também tentei fazer uma variável de controle chamada ctrl que serviria como o controlador para chamar uma thread específica, no entando eu pensava que a função pthread_join() invocava a thread, mas na verdade ela espera a thread terminar. Quando eu descobri que essa função não servia para isso eu tirei esta parte e o código esta como vocês podem ver. Eu também não sei direito como o mutex funciona! Pelo que eu entendi ele isola parte do código para que outras threads não tenham acesso enquanto uma está utilizando, mas isso não adiantou de nada. É só isso, só preciso fazer que as duas threads sejam sincronizadas de forma que cada uma execute a função de forma alternada. Desde já obrigado!

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags threads c ou faça a sua própria pergunta.