Есть две причины.Один из них - ложные пробуждения, как уже упоминалось в других ответах.Другой - это настоящие пробуждения.Представьте себе:
У вас есть два потока, A и B, заблокированные в одной и той же условной переменной, которая защищает очередь, очередь пуста.Какой-то поток помещает задание в очередь, вызывая поток A. Другой поток помещает задание в очередь, вызывая поток B. Поток A запускается первым и выполняет первое задание.Он возвращается к if
и видит, что условие все еще выполняется (поскольку есть вторая работа), поэтому он тоже выполняет эту работу.Теперь поток B получает процессор, возвращаясь из pthread_cond_wait
, но предикат не ложный, поскольку очередь пуста.
Вы знаете, что предикат был истинным, когда какой-то другой поток просил вас разбудить,У вас нет возможности узнать, что это все равно будет правдой, когда вы наконец-то получите расписание и сможете повторно получить мьютекс.