2012-04-15 12 views
8

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!

risposta

16
pthread_create(&mythread, NULL, func, NULL); 
pthread_create(&mythread, NULL, anotherFunc, NULL); 

pthread_mutex_destroy(&mymutex); 

Stai distruggendo il mutex prima i fili sono fatte con esso, in modo da tutte le scommesse sono spenti. Probabilmente vorrai scrivere su pthread_join 2 thread prima di distruggerlo.

+0

penso che funziona :) questo è il mio codice finale per chiunque sia interessato ... http://pastebin.me/bc23773578d79a55882d7ced4e04b026 –

+0

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.) –

+0

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? –

2

ho ottenuto alcuni errori comiplation

  • non ho potuto dichiarare int i in per ciclo

  • utilizzato un nome di argomento arg come argomento per le discussioni "func" e "anotherFunc"

Ho usato pthread_join prima del distruggendo il mutex.

In questo modo sto distruggendo la mia mutex "mymutex" dopo che entrambi i fili "FUNC" e "anotherFunc" hanno completato la loro esecuzione

Inoltre, ogni thread ha ora il proprio thread id "mythread1" e "mythread2" in questo modo posso usare la funzione pthread_join() per ogni thread

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

pthread_t mythread1, mythread2; 
pthread_mutex_t mymutex; 

void *anotherFunc(void *arg) 
{ 
    pthread_mutex_lock(&mymutex); 
    int i; 

    for(i = 0; i < 100; i++) 
     printf("anotherFunc\n"); 

    pthread_mutex_unlock(&mymutex); 

    pthread_exit(NULL); 
} 

void *func(void *arg) 
{ 
    pthread_mutex_lock(&mymutex); 
    int i; 
    for(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(&mythread1, NULL, func, NULL); 
    pthread_create(&mythread2, NULL, anotherFunc, NULL); 


    pthread_join(mythread1, NULL); 
    pthread_join(mythread2, NULL); 

    pthread_mutex_destroy(&mymutex); 

    return EXIT_SUCCESS; 
} 
Problemi correlati