Ответ Blaze приходит ближе всего, но не совсем ясно:
условные переменные должны использоваться только для сигнализации об изменении условия .
Поток 1 проверяет условие. Если условие не выполняется, он ожидает переменную условия, пока условие не будет выполнено. Поскольку условие проверяется первым, его не должно волновать, была ли передана переменная условия:
pthread_mutex_lock(&mutex);
while (!condition)
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
Поток 2 изменяет условие и сообщает об изменении через переменную условия. Ему все равно, ожидают ли потоки или нет:
pthread_mutex_lock(&mutex);
changeCondition();
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&cond)
Суть: связь осуществляется через какое-то условие. Переменная условия только пробуждает ожидающие потоки, чтобы они могли проверить условие .
Примеры условий:
- Очередь не пуста, поэтому запись может быть взята из очереди
- Установлен логический флаг, поэтому поток ожидает s, пока другой поток не покажет, что все в порядке, чтобы продолжить
- некоторые биты в наборе битов установлены, поэтому ожидающий поток может обрабатывать соответствующие события
см. Также pthread example