pthread_cond_wait oder pthread_cond_timedwait-Subroutine

Zweck

Blockiert den aufrufenden Thread in einer Bedingung

Bibliothek

Threadbibliothek (libpthreads.a)

Syntax

#include <pthread.h>

int pthread_cond_wait (cond, mutex)
pthread_cond_t *cond;
pthread_mutex_t *mutex;

int pthread_cond_timedwait (cond, mutex, timeout)
pthread_cond_t *cond;
pthread_mutex_t *mutex;
const struct timespec *timeout;

Beschreibung

Die Funktionen pthread_cond_wait und pthread_cond_timedwait werden verwendet, um eine Bedingungsvariable zu blockieren. Sie werden mit mutex aufgerufen, das vom aufrufenden Thread gesperrt wird, oder es kommt zu einem nicht definierten Verhalten.

Diese Funktionen geben mutex atomar frei und bewirken, dass der aufrufende Thread in der Bedingungsvariablen condblockiert; atomar bedeutet hier atomar, dass ein anderer Thread auf den Mutex und dann die Bedingungsvariable zugreift. Das heißt, wenn ein anderer Thread in der Lage ist, den Mutex anzufordern, nachdem der Thread, zu dem ein Block gehört, ihn freigegeben hat, verhält sich ein nachfolgender Aufruf von pthread_cond_signal oder pthread_cond_broadcast in diesem Thread so, als ob er ausgegeben wurde, nachdem der Thread, zu dem ein Block gehört, blockiert wurde.

Nach erfolgreicher Rückgabe ist der Mutex gesperrt und der aufrufende Thread ist Eigner des Mutex.

Wenn Sie Bedingungsvariablen verwenden, gibt es immer ein boolesches Prädikat mit einer gemeinsamen Variablen, die jeder Bedingungswartezeit zugeordnet ist, die wahr ist, wenn der Thread fortfahren muss. Es können falsche Wakeups von den Funktionen pthread_cond_wait oder pthread_cond_timedwait auftreten. Da die Rückgabe von pthread_cond_wait oder pthread_cond_timedwait nichts über den Wert dieses Vergleichselements impliziert, muss das Vergleichselement bei einer solchen Rückgabe erneut ausgewertet werden.

Die Verwendung von mehr als einem Mutex für gleichzeitig ablaufende pthread_cond_wait -oder pthread_cond_timedwait -Operationen für dieselbe Bedingungsvariable ist nicht definiert, d. h., eine Bedingungsvariable wird an einen eindeutigen Mutex gebunden, wenn ein Thread auf die Bedingungsvariable wartet, und diese (dynamische) Bindung endet, wenn der Wartestatus zurückgegeben wird.

Ein Bedingungswartestatus (ob zeitlich festgelegt oder nicht) ist ein Abbruchpunkt. Wenn der Aktivierungsstatus für die Abbruchfunktion eines Threads auf PTHREAD_CANCEL_DEFERRED gesetzt ist, wirkt sich eine Nebenwirkung auf eine Abbruchanforderung aus, während sich der Thread in einem Bedingungswartestatus befindet, dass der Mutex (in Kraft) erneut angefordert wird, bevor der erste Bereinigungshandler für den Abbruch aufgerufen wird. Der Effekt ist, als ob der Thread entsperrt wurde und bis zu dem Punkt ausgeführt werden kann, an dem der Aufruf von pthread_cond_wait oder pthread_cond_timedwaitzurückgegeben wird, aber an diesem Punkt wird die Abbruchanforderung bemerkt und anstatt an den Aufrufenden von pthread_cond_wait oder pthread_cond_timedwaitzurückzukehren, werden die Threadabbruchaktivitäten gestartet, zu denen auch das Aufrufen von Bereinigungshandlern gehört.

Ein Thread, dessen Blockierung aufgehoben wird, da er bei einem Aufruf von pthread_cond_wait oder pthread_cond_timedwait abgebrochen wird, verbraucht kein Bedingungssignal, das gleichzeitig an die Bedingungsvariable gerichtet sein kann, wenn andere Threads in der Bedingungsvariable blockiert sind.

Die Funktion pthread_cond_timedwait entspricht pthread_cond_wait mit der Ausnahme, dass ein Fehler zurückgegeben wird, wenn die durch timeout angegebene absolute Zeit (d. h., die Systemzeit ist größer-gleich timeout) verstrichen ist, bevor die Bedingung cond signalisiert oder übertragen wird, oder wenn die absolute Zeit, die durch timeout angegeben wird, bereits zum Zeitpunkt des Aufrufs übergeben wurde. Wenn solche Zeitlimits auftreten, gibt pthread_cond_timedwait den Mutex frei und fordert den Mutex an, auf den mutexverweist. Die Funktion pthread_cond_timedwait ist ebenfalls ein Abbruchpunkt. Die absolute Zeit, die durch timeout angegeben wird, kann entweder auf der Echtzeit-Systemuhr oder der monotonen Systemuhr basieren. Die Referenzuhr für die Bedingungsvariablen wird durch Aufrufen von pthread_condattr_setclock vor ihrer Initialisierung mit dem entsprechenden Bedingungsattributobjekt festgelegt.

Wenn ein Signal an einen Thread übergeben wird, wartet er auf eine Bedingungsvariable. Nach der Rückkehr vom Signalhandler nimmt der Thread das Warten auf die Bedingungsvariable wieder auf, als ob sie nicht unterbrochen worden wäre, oder er gibt aufgrund einer falschen Aktivierung null zurück.

Parameter

Element Beschreibung
cond Gibt die Bedingungsvariable an, auf die gewartet werden soll
mutex Gibt den Mutex an, der zum Schutz der Bedingungsvariablen verwendet wird. Der Mutex muss gesperrt werden, wenn die Subroutine aufgerufen wird.
Zeitlimit Verweist auf die absolute Zeitstruktur, die das Zeitlimit für den Blockierungsstatus angibt.

Rückgabewerte

Außer bei ETIMEDOUT wirken alle diese Fehlerprüfungen so, als ob sie unmittelbar zu Beginn der Verarbeitung für die Funktion ausgeführt wurden und eine Fehlerrückgabe verursachen, bevor der Status des Mutex, der durch mutex angegeben wird, oder die Bedingungsvariable, die durch condangegeben wird, geändert wird.

Nach erfolgreichem Abschluss wird der Wert null zurückgegeben. Andernfalls wird eine Fehlernummer zurückgegeben, die den Fehler angibt.

Fehlercodes

Die Funktion pthread_cond_timedwait schlägt in folgenden Fällen fehl:

Element Beschreibung
ETIMEDOUT Die durch timeout angegebene Zeit für pthread_cond_timedwait ist abgelaufen.

Die Subroutinen pthread_cond_wait und pthread_cond_timedwait schlagen fehl, wenn die folgenden Fehlercodes zurückgegeben werden:

Element Beschreibung
EINVAL Der mit cond, mutexoder timeout angegebene Wert ist ungültig.
EINVAL Es wurden unterschiedliche Mutexe für gleichzeitige Operationen pthread_cond_wait oder pthread_cond_timedwait für dieselbe Bedingungsvariable angegeben.
EINVAL Der aktuelle Thread war zum Zeitpunkt des Aufrufs nicht Eigner des Mutex.
EPERM Der Mutex war zum Zeitpunkt des Aufrufs nicht Eigentum des aktuellen Threads, XPG_SUS_ENV ist auf ON gesetzt und XPG_UNIX98 ist nicht festgelegt.
ENOTRECOVERABLE (ENOTRECOVERABLE) Der geschützte Zustand des Mutex kann nicht wiederhergestellt werden.
EOWNERDEAD Der Mutex ist ein robuster Mutex und der Prozess des Threads, der Eigner des Mutex ist, während er die Mutex-Sperre hält.

Diese Subroutinen geben keinen Fehlercode EINTR zurück.