Threads warten auf eine Bedingung (z.B. Variable hat bestimmten Wert).
Viele Threads arbeiten und zählen dabei die Variable count hoch. Ein Thread wartet darauf, daß count einen bestimmten Wert hat, um eine Aktion auszuführen (Erzeuger-Verbraucher- Synchronisation, Pipe).
#define MAX_COUNT 28 int count = 0; pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cv = PTHREAD_COND_INITIALIZER; void *waiter(void *args) { pthread_mutex_lock(&lock); while (count < MAX_COUNT) { pthread_cond_wait(&cv, &lock); } do_something_fast(); pthread_mutex_unlock(&lock); } void *counter(void *args) { pthread_mutex_lock(&lock); count = new_count(); if (count == MAX_COUNT) { pthread_cond_signal(&cv); } pthread_mutex_unlock(&lock); }
Die "Condition"-Variable cv zeigt nur an, ob die Bedingung erfüllt ist; die Bedingung selbst wird mit anderen Größen ausgedrückt (hier: count).
Um Race-Bedingungen mit der Variable count zu verhindern, ist der Mutex lock nötig.
pthread_cond_wait prüft, ob die Bedingung erfüllt ist und wartet
sonst. Es gibt beim Warten sofort den Mutex frei.
Wird der Thread geweckt, besorgt er sich erst wieder den Mutex
und macht dann nach dem wait weiter.
pthread_cond_signal signalisiert einem wartenden Thread (von evtl. mehreren) das Eintreffen der Bedingung.
Nach dem Wecken wird die Bedingung in while noch einmal geprüft, denn zwischen Signal und dem Erlangen des Mutex könnte ein anderer Thread count schon wieder geändert haben!
Bedingungsvariable haben keinen Zustand, d.h. ein Signal vor einem wait bewirkt nichts.
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_cond_init(pthread_cond_t *cond,
const pthread_condattr_t *attr);
int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_wait(pthread_cond_t *cond,
pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond,
pthread_mutex_t *mutex, const struct timespec *abstime);