Ho un grosso problema, non riesco a capire perché i mutex in C non funzionano come mi aspetto. Questo è il mio codice:Filetti POSIX C. Esempio Mutex. Non funziona come previsto
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_t mythread;
pthread_mutex_t mymutex;
void *anotherFunc(void*)
{
pthread_mutex_lock(&mymutex);
for(int i = 0; i < 100; i++)
printf("anotherFunc\n");
pthread_mutex_unlock(&mymutex);
pthread_exit(NULL);
}
void *func(void*)
{
pthread_mutex_lock(&mymutex);
for(int i = 0; i < 100; i++)
printf("func\n");
pthread_mutex_unlock(&mymutex);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_mutex_init(&mymutex, NULL);
pthread_create(&mythread, NULL, func, NULL);
pthread_create(&mythread, NULL, anotherFunc, NULL);
pthread_mutex_destroy(&mymutex);
pthread_exit(NULL);
return EXIT_SUCCESS;
}
Quello che mi aspetto che accada è il programma per stampare prima 100 "FUNC" e poi 100 messaggi "anotherFunc". Quello che mi aspetto è che l'esecuzione raggiunga func e blocchi il mutex. Quando l'esecuzione raggiunge anotherFunc, mi aspetto di aspettare finché func non sbloccherà il mutex. Ma ho interferito messaggi come
func func func anotherFunc anotherFunc anotherFunc func anotherFunc
Non capisco come funziona questa cosa. Per favore aiuto!
penso che funziona :) questo è il mio codice finale per chiunque sia interessato ... http://pastebin.me/bc23773578d79a55882d7ced4e04b026 –
Ancora rotto. Assicurati solo che * un * thread sia terminato quando distruggi il mutex. Cosa succede se l'altro non è ancora finito? Non vi è alcuna garanzia che il thread inizi, acquisisca il mutex o termini in un ordine particolare a meno che non lo forziate in qualche modo. (La lezione uno del multithreading è questa: le cose sono assicurate solo in un particolare ordine se le impone di verificarsi in quell'ordine.) –
Sì, ma ho entrambe le funzioni avviate in un thread, l'unico thread: mythread. Va bene così o è sempre più sicuro usare un thread per una funzione? –