В моем вопросе конкретно говорится, почему он был разработан таким образом из-за ненужной импликации производительности.
Когда поток T1 имеет этот код:
cv.acquire()
cv.wait()
cv.release()
и поток T2 имеет этот код:
cv.acquire()
cv.notify() # requires that lock be held
cv.release()
происходит то, что T1 ждет и освобождает блокировку, затем T2 приобретает его, уведомляет cv
, который просыпает T1. Теперь есть состояние гонки между выпуском T2 и T1 reacquiring после возвращения из wait()
. Если T1 сначала попытается выполнить повторную загрузку, он будет излишне ресуспендирован до завершения T2 release()
.
Примечание. Я намеренно не использую оператор with
, чтобы лучше проиллюстрировать гонку явными вызовами.
Это кажется ошибкой дизайна. Существует ли какое-либо обоснование для этого, или я что-то не хватает?