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?
Es gibt einen ganzen Absatz in der man-Seite darüber: https://linux.die.net/man/3/pthread_cond_signal – mch
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. –