TL; DR Припущення ("контракт") помилкових пробуджень - це розумне архітектурне рішення, прийняте для забезпечення реально надійних реалізацій планувальників ниток.
"Міркування щодо ефективності" тут не мають значення, це лише непорозуміння, які набули поширення через те, що вони заявили в опублікованій авторитетній довідці. (авторитетні посилання можуть мати помилки, знаєте - просто запитайте Галілео Галілея ) Стаття Вікіпедії зберігає посилання на замітку, яку ви цитували, лише тому, що вона повністю відповідає їх формальним рекомендаціям цитування опублікованої посилання.
Набагато переконливіша причина введення концепції хибних пробуджень надана у цій відповіді на ПЗ, яка ґрунтується на додаткових подробицях, наведених у (старішій версії) цієї самої статті:
Стаття Вікіпедії про помилкові пробудження має такий примх :
pthread_cond_wait()
Функція в Linux здійснюється з допомогою futex
системного виклику. Кожен системний виклик блокування в Linux різко повертається, EINTR
коли процес отримує сигнал. ... pthread_cond_wait()
не може перезапустити очікування, оскільки це може пропустити справжнє пробудження в той час, коли він був поза futex
системним дзвінком ...
Подумайте про це ... як і будь-який код, у планувальник потоків може виникнути тимчасове затемнення через щось ненормальне, що відбувається в базовому апаратному / програмному забезпеченні. Звичайно, слід подбати про те, щоб це сталося якомога рідше, але оскільки не існує такого поняття, як 100% надійне програмне забезпечення, розумно припустити, що це може статися, і подбати про витончене відновлення у випадку, якщо планувальник виявить це (наприклад, спостерігаючи за відсутніми серцебиттями ).
Тепер, як планувальник може відновитись, враховуючи, що під час затемнення він може пропускати деякі сигнали, призначені для сповіщення потоків очікування? Якщо планувальник нічого не робить, згадані "нещасливі" потоки просто зависять, чекаючи вічно - щоб уникнути цього, планувальник просто надішле сигнал усім потокам, що очікують.
Це обумовлює необхідність встановлення "контракту" про те, що нитка очікування може бути повідомлена без причини. Якщо бути точним, є причина - затемнення планувальника, але оскільки нитка розроблена (з поважної причини), щоб не забувати про деталі внутрішньої реалізації планувальника, ця причина, швидше за все, краще представити як "хибну".
З точки зору нитки, це дещо нагадує закон Постеля (він же принцип надійності ),
будьте консервативними у тому, що робите, будьте ліберальні у тому, що приймаєте від інших
Припущення помилкових пробуджень змушує нитку бути консервативним у тому, що вона робить : встановити умову при повідомленні інших потоків і ліберальну в тому, що вона приймає : перевірити умову при будь-якому поверненні з очікування і повторити очікування, якщо її ще немає.