Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

loop de threads

Estava vendo um video sobre criação de threads em loop, tentei implementar o código dele porem o meu da um resultado completamente diferente e eu não sei o porque. Video em questão: https://www.youtube.com/watch?v=xoXzp4B8aQk&list=PLfqABt5AS4FmuQf70psXrsMLEDQXNkLq2&index=5 meu codigo:

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

int mails = 0;
pthread_mutex_t mutex;

void* routine(){
    for(int i = 0; i<15; i++){
        pthread_mutex_lock(&mutex);
        printf("mails: %d\n", mails);
        mails++;
        pthread_mutex_unlock(&mutex);
    }
}

int main(int argc, char* argv[]){
    pthread_t th[4];
    int i;
    pthread_mutex_init(&mutex, NULL);
    for (i=0;i<4;i++){
        if (pthread_create(th + 1, NULL, &routine, NULL) != 0){
            return 1;
        }
        printf("Thread %d has started\n", i);
    }
    for (i=0;i<4;i++){
        if (pthread_join(th[i], NULL)!=0){
            return 2;
        }
        printf("Thread %d has finished execution\n", i);
    }

    pthread_mutex_destroy(&mutex);
    printf("Number of mails %d\n", mails);
    return 0;
}

obs 1: reduzi o numero de mails para poder ver o que estava acontecendo

obs 2: uma versão do codigo sem o loop funcionava normalmente

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

int mails = 0;
pthread_mutex_t mutex;

void* routine(){
    for(int i = 0; i<100; i++){
        pthread_mutex_lock(&mutex);
        mails++;
        pthread_mutex_unlock(&mutex);
    }
}

int main(int argc, char* argv[]){
    pthread_t p1, p2;
    pthread_mutex_init(&mutex, NULL);
    if (pthread_create(&p1, NULL, &routine, NULL) != 0){
        return 1;
    }
    if (pthread_create(&p2, NULL, &routine, NULL) != 0){
        return 2;
    }
    if (pthread_join(p1, NULL) !=0){
        return 3;
    }
    if (pthread_join(p2, NULL) !=0){
        return 4;
    }
    pthread_mutex_destroy(&mutex);
    printf("Number of mails %d\n", mails);
    return 0;
}
1 resposta
solução!

Pelo que vi o problema está no seu for, que você incrementa i mas usa th + 1, enviando sempre a mesma thread (a segunda). Imagino que você queria usar th + i, enviando a thread[0] primeiro, depois a thread[1] e assim sucessivamente, não?