2016-09-19 2 views
0

Ich habe eine Frage zu Mutex und Pthreads.Umgang mit freigegebenen Ressourcen mit Pthread Mutex

Wenn eine gemeinsame Markierung vorhanden ist, können wir sie aufrufen (F1). Und es gibt mehrere Threads. Aber nur ein Thread (T1) kann das Flag erhöhen/beenden, und alle anderen Threads (T2..Tn) lesen oder ziehen nur den Status.

Ist es genug, wenn T1 mutex_lock/mutex_unlock verwendet, wenn das Flag F1 mit einem neuen Wert gesetzt wird? Sollten alle anderen Threads auch mutex_lock/mutex_unlock verwenden, auch wenn sie nur den Status von F1 lesen?

Exemple1: 

    T1() 
    { 
     while(Running) 
     { 
      pthread_mutex_lock(&lock); 
      F1 = true; 
      pthread_mutex_unlock(&lock); 
     } 
    } 

    T2() 
    { 
     while(Running) 
     { 
      if(F1) { 
       /* Do something */ 
      } 
     } 
    } 



Exemple2: 

    T1() 
    { 
     while(Running) 
     { 
      pthread_mutex_lock(&lock); 
      F1 = true; 
      pthread_mutex_unlock(&lock); 
     } 
    } 

    T2() 
    { 
     while(Running) 
     { 
      pthread_mutex_lock(&lock); 
      if(F1) { 
       /* Do something */ 
      } 
      pthread_mutex_unlock(&lock); 
     } 
    } 

Antwort

1

Sie können das Idiom für einzelne Schreiber und mehrere Leser verwenden.

Reading:

pthread_rwlock_rdlock(&rwlock); 

Schreiben:

pthread_rwlock_wdlock(&rwlock); 

Wenn Ihr Anwendungsfall so einfach wie das Beispiel ist Sie auf dem Laufenden, könnten Sie eine Lock-freie Version mit atomaren Flaggen in Betracht ziehen.

1

Unter dem Pthreads-Modell müssen die Leser do auch eine Synchronisationsoperation durchführen. Dies kann ein pthread_mutex_lock()/ Paar in den Lesern und Schreiber sein, wie Sie beschrieben haben, oder alternativ metalfox's suggestion eines Leser-Schreiber-Lock.