2016-12-21 3 views
0

Ich versuche, meinen Kopf um Pthread Zustand Variablen zu wickeln. Ich habe einige Code-Beispiele gesehen, die pthread_cond_wait und pthread_cond_signal und alle von ihnen wie folgt aussehen verwenden:Über die Verwendung von Pthread_cond_wait

while (condition) 
{ 
    // Assume that the mutex is locked before the following call 
    pthread_cond_wait(&cond, &mutex); 
} 

Gibt es einen Grund unter der Bedingung einer while-Schleife für den Einsatz? Warum nicht einfach eine einzige if-Anweisung verwenden?

+0

Wie hängt das mit C++ zusammen? – Olaf

+0

Ich habe das Tag entfernt, danke. –

Antwort

1

Unechte Wakeups.

Siehe Why does pthread_cond_wait have spurious wakeups? und auch https://en.wikipedia.org/wiki/Spurious_wakeup:

Unechte Wakeup eine Komplikation in der Variablen Verwendung der Bedingung beschreibt, wie durch bestimmte Multithreading-APIs wie POSIX Threads und der Windows-API zur Verfügung gestellt.

Auch nachdem eine Zustandsvariable von einem wartenden Thread aus Sicht angezeigt wurde, kann die erwartete Bedingung immer noch falsch sein. Einer der Gründe dafür ist ein ungewolltes Aufwecken; dass ist, konnte ein Thread aus seinem Wartezustand aufgeweckt werden, obwohl kein Thread die Zustandsvariable signalisierte. Für die Korrektheit ist es notwendig, dann zu überprüfen, dass die Bedingung in der Tat wahr ist, nachdem der Thread fertig ist zu warten. Da falsche Wakeup wiederholt geschehen kann, wird dies durch das Warten in einer Schleife erreicht, die endet, wenn die Bedingung erfüllt ist ...

+0

Spürious Wakeups sind ein Teil des Grundes, aber nicht der ganze Grund. –

+0

@JohnBollinger Beziehen Sie sich auf die hier genannten Gründe: http://Stackoverflow.com/a/8594644/4756299? –

+0

Ich behaupte, dass "Ein in pthread_cond_wait blockierter Thread wegen eines Aufrufs zum Signalisieren oder Broadcasting zurückkehrt, aber nachdem er den Mutex zurückerlangt hat, ist das zugrunde liegende Prädikat nicht mehr wahr" (zitiert aus Ihrer SO-Referenz) wird nicht korrekt als a klassifiziert "aufrührerisches Aufwachen". Ihr Wikipedia-Artikel scheint mir in diesem Detail der Terminologie zuzustimmen. –

1

Gibt es einen Grund für eine while-Schleife unter der Bedingung verwenden? Warum nicht einfach eine einzige if-Anweisung verwenden?

Die Idee hinter Zustandsvariablen besteht darin, die Threadausführung zu unterbrechen, bis eine bestimmte Bedingung erfüllt ist. Die Bedingung ist jedoch nicht in der Variablen enthalten - sie muss vom Programmierer zur Verfügung gestellt werden.

Wenn die entsprechende Bedingung bereits erfüllt ist, muss der Betrieb nicht unterbrochen werden. Der Schlüssel hier ist jedoch, dass, wenn der Thread wieder aufgenommen wird, die Bedingung noch nicht erfüllt werden kann, entweder weil etwas zwischen der Zustandsvariable geändert wurde und der Thread in der Lage ist fortzufahren, oder weil der Thread schelmisch aufwachte (das ist erlaubt zu passieren, obwohl es selten geschieht). Das Programm überprüft daher den Zustand bei jedem Aufwachen erneut, um zu sehen, ob er das Warten wieder aufnehmen muß.

Verwandte Themen