Щоб процитувати сторінку людини:
При використанні змінних умов завжди є булевий предикат, що включає спільні змінні, пов'язані з кожною умовою очікування, що є істинним, якщо потік повинен продовжуватися. Можуть виникати помилкові пробудження функцій pthread_cond_timedwait () або pthread_cond_wait (). Оскільки повернення з pthread_cond_timedwait () або pthread_cond_wait () нічого не означає про значення цього предиката, предикат повинен бути повторно оцінений після такого повернення.
Отже, pthread_cond_waitможе повернутися, навіть якщо ви цього не сигналізували. Принаймні, на перший погляд, це здається досить жорстоким. Це було б як функція, яка випадковим чином повертає неправильне значення або випадково повертається до того, як фактично дійшла до правильного оператора return. Це здається великою помилкою. Але той факт, що вони вирішили задокументувати це на сторінці "man", а не виправляти, це, мабуть, свідчить про те, що є законна причина, чому в pthread_cond_waitкінцевому підсумку прокидаються неправдиво. Імовірно, є щось суттєве у тому, як це працює, що робить це таким чином, що це не може допомогти. Питання - що.
Чому ж pthread_cond_waitповернутися підроблено? Чому він не може гарантувати, що він прокинеться лише тоді, коли буде правильно сигналізовано? Чи може хтось пояснити причину своєї хибної поведінки?
pthread_cond_(timed)wait: "Якщо сигнал подається ..., потік продовжується в очікуванні змінної умови, як ніби він був не переривається, або він поверне нуль через помилкове пробудження ". Інші функції блокування вказують, EINTRколи їх перериває сигнал (наприклад read), або потрібно відновити їх (наприклад pthread_mutex_lock). Тож якби не було інших причин помилкового пробудження, pthread_cond_waitможна було б визначити як будь-яку з цих.