Не так, что условная переменная будет ошибочно просыпаться; переменная условия будет активирована, только если она была передана из другого потока. Однако возможно, что к тому моменту, когда поток был перепланирован на выполнение, какой-то другой поток уже успел захватить ресурс, на котором вы ожидали, и поэтому необходимо перепроверить. Например, если группа потоков x, y, z ожидает некоторого ресурса R, который w ранее удерживал, и x, y, z, w обмениваются данными через переменную условия ... предположим, что w выполняется с R и сигнализирует x , у, г. Таким образом, x, y и z все будут удалены из очереди ожидания и помещены в очередь выполнения, которая будет запланирована для выполнения. Предположим, что сначала запланировано x ... так что затем он получает R, а затем его можно перевести в спящий режим, а затем можно запланировать y, и поэтому, когда y выполняется, ресурс R, для которого y ожидал ранее, все еще недоступен. , поэтому вам необходимо снова пойти спать. Затем z просыпается, и z также обнаруживает, что R все еще используется, поэтому z нужно снова вернуться в спящий режим и т. Д.
Если у вас ровно два потока и переменная условия совместно используется только двумя из них, иногда возникают ситуации, когда можно не выполнять эту проверку. Однако, если вы хотите, чтобы ваше приложение было динамичным и способным масштабировать до произвольного числа потоков, тогда полезно иметь привычку (не говоря уже о том, что она намного проще и менее беспокоящей) выполнять эту дополнительную проверку, как это требуется в большинство ситуаций.