Щоб процитувати сторінку людини:
При використанні змінних умов завжди є булевий предикат, що включає спільні змінні, пов'язані з кожною умовою очікування, що є істинним, якщо потік повинен продовжуватися. Можуть виникати помилкові пробудження функцій 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
можна було б визначити як будь-яку з цих.