2017-02-20 5 views
0

Ich versuche, eine gleichzeitige Warteschlange zu implementieren, und Skelett-Implementierung ist, wie folgend:Unterschied zwischen pthread_cond_signal vor und nach pthread_mutex_unlock

struct queue 
{ 
    int try_pop() 
    { 
     pthread_mutex_lock(&mutex_); 
     int rt; 
     while((rt = do_pop()) == -1) 
     { 
      pthread_cond_wait(&cond_,&mutex_); 
     } 
     pthread_mutex_unlock(&mutex_); 
     return rt; 
    } 

    bool push(int num) 
    { 
     pthread_mutex_lock(&mutex_); 
     push_impl(num); 
#if 0 
     /*signal before unlock*/ 
     pthread_cond_signal(&cond_); 
     pthread_mutex_unlock(&mutex_); 
#else 
     /*signal after unlock*/ 
     pthread_mutex_unlock(&mutex_); 
     pthread_cond_signal(&cond_); 
#endif 
     return true; 
    } 

    // private function and data member 
} 

ich pthread_cond_signal vor oder nach dem Entriegeln des mutex aufrufen können.

Meine Frage ist, was ist der Unterschied zwischen Nettoeffekt von zwei Ansätze?

+1

Es gibt einen ganzen Absatz in der man-Seite darüber: https://linux.die.net/man/3/pthread_cond_signal – mch

+0

Dies kann relevant sein: http://stackoverflow.com/questions/4544234/calling- pthread-cond-signal-ohne-locking-mutex/4544494, aber OTOH, du behälst den Mutex, wenn du den shared state änderst, also ist es vielleicht in Ordnung, Mutex vor _signal in deinem Fall zu entsperren. –

Antwort

0

Wenn Sie Threads unterschiedliche Prioritäten haben streit auf try_pop(), dann signalisiert nach Entriegeln eines Fensters lässt, wo ein hoher Priorität Thread in pthread_cond_wait() blockiert ist, aber ein niedriger Priorität Thread tritt try_pop() zwischen der entsperren und das Signal, so dass es vor dem Thread mit hoher Priorität springen kann. Eine Signalisierung vor dem Entsperren verhindert dies.

Wenn Sie nicht haben unterschiedliche Thread-Prioritäten konkurrieren so, dann die Signalisierung nach dem Entsperren erlaubt den signalisierten Thread aufzuwachen und sofort den Mutex, anstatt von "auf die Zustandsvariable warten" zu einem Zwischenzustand "Warten auf den Mutex" zuerst.

Wirklich, es ist sehr wenig drin. Es ist unwahrscheinlich, dass dies einen messbaren Unterschied macht.

Verwandte Themen