Чтобы процитировать man страницу:
При использовании условных переменных всегда существует логический предикат, включающий общие переменные, связанные с каждым условным ожиданием, которое истинно, если поток должен продолжить. Могут возникнуть ложные пробуждения от функций pthread_cond_timedwait () или pthread_cond_wait (). Поскольку возврат из pthread_cond_timedwait () или pthread_cond_wait () ничего не подразумевает в значении этого предиката, предикат должен быть переоценен после такого возврата.
Таким образом, pthread_cond_wait
можете вернуться, даже если вы не сообщили об этом. По крайней мере, на первый взгляд это кажется довольно жестоким. Это было бы похоже на функцию, которая случайно вернула неправильное значение или вернула случайно, прежде чем она действительно достигла правильного оператора возврата. Это похоже на серьезную ошибку. Но тот факт, что они решили документировать это на странице руководства, а не исправлять это, похоже, указывает на то, что есть законная причина, по которой мы pthread_cond_wait
внезапно просыпаемся. Предположительно, есть что-то внутреннее в том, как это работает, что делает его таким, что с этим ничего не поделаешь. Вопрос в том, что.
Почему же pthread_cond_wait
вернуться поддельно? Почему он не может гарантировать, что проснется только тогда, когда на него правильно подали сигналы? Кто-нибудь может объяснить причину его ложного поведения?
pthread_cond_(timed)wait
: «Если сигнал доставлен ... поток возобновляет ожидание переменной условия, как если бы он был не прервано, или оно должно вернуть ноль из-за ложного пробуждения ". Другие функции блокировки указывают, EINTR
когда прервано сигналом (например read
) или требуется возобновить (например pthread_mutex_lock
). Так что, если бы не было других причин для ложного пробуждения, pthread_cond_wait
можно было бы определить, как любой из них.