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;
} 
            