Ich lerne Pthread und warte Bedingungen. Soweit ich wie ein typischer wartenden Thread sagen kann, ist:Pthread und Wartebedingungen
pthread_mutex_lock(&m);
while(!condition)
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Was ich nicht verstehe ist, warum while(!condition)
die Linie notwendig ist, auch wenn ich pthread_cond_signal()
verwenden den Faden zu wecken.
Ich kann das verstehen, wenn ich pthread_cond_broadcast()
verwende ich brauche Bedingung zu testen, weil ich alle wartenden Threads aufwachen und einer von ihnen die Bedingung machen kann wieder falsch vor den Mutex Entriegeln (und damit die Ausführung zu einem anderen aufgeweckt übertragen Thread, der an diesem Punkt nicht ausgeführt werden soll). Aber wenn ich pthread_cond_signal()
verwende, wache ich nur ein Thread, so muss die Bedingung wahr sein. So könnte der Code wie folgt aussehen:
pthread_mutex_lock(&m);
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Ich lese etwas über falsche Signale, die passieren können. Ist das (und nur das) der Grund? Warum sollte ich falsche Singnals haben? Oder gibt es noch etwas, das ich nicht verstehe?
Ich gehe davon aus das Signal Code ist wie folgt:
pthread_mutex_lock(&m);
condition = true;
pthread_cond_signal(&cond); // Should wake up *one* thread
pthread_mutex_unlock(&m);
genau. abgestimmt. das sollte mehr Aufmerksamkeit bekommen als die angenommene Antwort. –