Согласно статье в Википедии о ложных пробуждениях
msgstr "поток может быть выведен из состояния ожидания, даже если ни один из потоков не сигнализировал об условной переменной".
Хотя я знаю об этой «функции», я никогда не знал, что на самом деле вызвало ее, пока, в той же статье
«Ложные пробуждения могут показаться странными, но в некоторых многопроцессорных системах обеспечение полного предсказания пробуждения условия может существенно замедлить все операции с переменными состояния»
Звучит как ошибка, которую просто не стоит исправлять, верно?
multithreading
bug
features
Джеймс
источник
источник
Ответы:
TL; DR Предположение («контракт») о ложных пробуждениях - это разумное архитектурное решение, принятое для обеспечения реально надежных реализаций потокового планировщика.
«Производственные соображения» здесь не имеют значения, это просто недоразумение, которое стало широко распространенным из-за того, что указано в опубликованной авторитетной ссылке. (авторитетные ссылки могут иметь ошибки, знаете, просто спросите Галилео Галилея ) В статье в Википедии содержится ссылка на цитируемую вами заметку только потому, что она полностью соответствует их формальным правилам цитирования опубликованной ссылки.
Гораздо более веская причина для введения концепции ложных пробуждений приведена в этом ответе SO, который основан на дополнительных деталях, представленных в (более старой версии) той же статьи:
Подумайте об этом ... как и любой код, планировщик потоков может временно отключиться из-за чего-то ненормального, происходящего в базовом оборудовании / программном обеспечении. Конечно, следует позаботиться о том, чтобы это происходило как можно реже, но поскольку не существует такого понятия, как 100% надежное программное обеспечение, разумно предположить, что это может произойти, и позаботиться о постепенном восстановлении в случае, если планировщик обнаружит это (например, наблюдая за отсутствующими сердцебиениями ).
Теперь, как планировщик мог восстановиться, учитывая, что во время отключения он мог пропустить некоторые сигналы, предназначенные для уведомления ожидающих потоков? Если планировщик ничего не делает, упомянутые «неудачные» потоки будут просто зависать, ожидая вечно - чтобы избежать этого, планировщик просто отправит сигнал всем ожидающим потокам.
Это делает необходимым заключение «контракта» о том, что ожидающий поток может быть уведомлен без причины. Чтобы быть точным, была бы причина - отключение планировщика - но поскольку поток спроектирован (по уважительной причине), чтобы не обращать внимания на внутренние детали реализации планировщика, эту причину, вероятно, лучше представить как «ложную».
С точки зрения нити это несколько напоминает закон Постеля (он же принцип устойчивости ),
Предположение о ложных пробуждениях заставляет поток быть консервативным в том, что он делает : устанавливать условие при уведомлении других потоков и быть либеральным в том, что он принимает : проверять условие при любом возврате из ожидания и повторять ожидание, если его еще нет.
источник
Это не стоит исправлять, так как код вызывающей стороны должен использовать ту же самую обработку (проверку состояния) в любом случае, чтобы иметь дело с состоянием гонки.
Одна обработка для двух проблем, которые я суммирую следующим:
Поскольку позднее может произойти, некоторые зашли настолько далеко, что включили в контракт ложное пробуждение:
ТАК ссылка
источник