Salve a tutti, cercando di risolvere un esercizio banale sui thread (vi allego il testo)

Una variabile intera x, inizializzata a 0, è condivisa tra 3 thread A, B e C. Ogni thread:
1. attende un numero casuale di ms
2. se la variabile condivisa x < 500 allora incrementa x altrimenti va al punto 5
3. incrementa una variabile locale hit
4. torna al punto 1
5. mostra a schermo il valore di hit e termina la propria esecuzione
Il programma termina quando tutti i thread hanno terminato la propria esecuzione.
Implementare il sistema descritto proteggendo opportunamente la variabile x dagli accessi concorrenti.

Dopo averlo scritto e compilato, l'eseguibile non fa vedere i processi di incremento della x, ma solamente le scritte di attesa. Sapreste dirmi cosa sbaglio dato che non sono molto pratico col C? Grazie mille in anticipo

codice:
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<time.h>


int x = 0;
pthread_t a,b,c;
pthread_mutex_t mutex;


void * function_a(){
	int casual_ms = rand() % 100;
	printf("Attendo %d ms..",casual_ms);
	int hit_a = 0;
	usleep(casual_ms);
	if (x < 500 ){
		pthread_mutex_lock(&mutex);
		x++;
		pthread_mutex_unlock(&mutex);
		hit_a++;
	}
	else printf("Valore di hit_a: %d \n... Sto uscendo\n", hit_a);
	pthread_exit(NULL);
}


int main (){
	//srand(time(NULL));
	pthread_mutex_init(&mutex,NULL);
	pthread_create(&a,NULL,(void*)function_a,NULL);
	pthread_create(&b,NULL,(void*)function_b,NULL);
	pthread_create(&c,NULL,(void*)function_c,NULL);
	
	pthread_join(a,NULL);
	pthread_join(b,NULL);
	pthread_join(c,NULL);
	
	return 0;
}
(ho allegato solamente una funzione per snellire il codice, dato che sono tutte e 3 identiche, eccetto per il nome delle variabili)