Переменные условия работают так:
/* Lock a mutex. */
pthread_mutex_lock(&mtx);
/* Wait on condition variable. */
while (/* condition *.)
pthread_cond_wait(&cond, &mtx);
/* When pthread_cond_wait returns mtx is atomically locked. */
/* ... */
/* Unlock the mutex. */
pthread_mutex_unlock(&mtx);
Итак, главное, что нужно понять, это то, что многие потоки могут проснуться при отправке трансляции, но только один "выиграет" гонку и фактически заблокирует mtx
и выйдет из цикла.