TL; DR Предположение («контракт») о ложных пробуждениях - это разумное архитектурное решение, принятое для обеспечения реально надежных реализаций потокового планировщика.
«Производственные соображения» здесь не имеют значения, это просто недоразумение, которое стало широко распространенным из-за того, что указано в опубликованной авторитетной ссылке. (авторитетные ссылки могут иметь ошибки, знаете, просто спросите Галилео Галилея ) В статье в Википедии содержится ссылка на цитируемую вами заметку только потому, что она полностью соответствует их формальным правилам цитирования опубликованной ссылки.
Гораздо более веская причина для введения концепции ложных пробуждений приведена в этом ответе SO, который основан на дополнительных деталях, представленных в (более старой версии) той же статьи:
В статье Википедии о ложных пробуждениях есть такой лакомый кусочек:
pthread_cond_wait()
Функция в Linux осуществляется с помощью futex
системного вызова. Каждый блокирующий системный вызов в Linux внезапно завершается, EINTR
когда процесс получает сигнал. ... pthread_cond_wait()
не может перезапустить ожидание, потому что оно может пропустить реальное пробуждение за то короткое время, которое было за пределами futex
системного вызова ...
Подумайте об этом ... как и любой код, планировщик потоков может временно отключиться из-за чего-то ненормального, происходящего в базовом оборудовании / программном обеспечении. Конечно, следует позаботиться о том, чтобы это происходило как можно реже, но поскольку не существует такого понятия, как 100% надежное программное обеспечение, разумно предположить, что это может произойти, и позаботиться о постепенном восстановлении в случае, если планировщик обнаружит это (например, наблюдая за отсутствующими сердцебиениями ).
Теперь, как планировщик мог восстановиться, учитывая, что во время отключения он мог пропустить некоторые сигналы, предназначенные для уведомления ожидающих потоков? Если планировщик ничего не делает, упомянутые «неудачные» потоки будут просто зависать, ожидая вечно - чтобы избежать этого, планировщик просто отправит сигнал всем ожидающим потокам.
Это делает необходимым заключение «контракта» о том, что ожидающий поток может быть уведомлен без причины. Чтобы быть точным, была бы причина - отключение планировщика - но поскольку поток спроектирован (по уважительной причине), чтобы не обращать внимания на внутренние детали реализации планировщика, эту причину, вероятно, лучше представить как «ложную».
С точки зрения нити это несколько напоминает закон Постеля (он же принцип устойчивости ),
быть консервативным в том, что вы делаете, быть либеральным в том, что вы принимаете от других
Предположение о ложных пробуждениях заставляет поток быть консервативным в том, что он делает : устанавливать условие при уведомлении других потоков и быть либеральным в том, что он принимает : проверять условие при любом возврате из ожидания и повторять ожидание, если его еще нет.