Неясно конечно в чем заключается та "подготовка к пробуждению".
Изменение состояния нитки - флаг поменять. Ядро для каждого объекта синхронизации хранит очередь ниток, которые ожидают освобождения этого объекта. Все они имеют состояние останова. Что бы пробудить нужно это состояние поменять.
И вот с "одной" - ведь в ОC wake будит "хотя бы одну", но может и больше, какую тогда готовит? Понятно не все вопросы имеют (простые) ответы.
С условными переменными, я как разработчик, могу сказать ядру разбуди одну нить (wakeOne) не важно какую или разбудить все ожидающие нити (wakeAll).
Если я добавил одно задание в очередь заданий, то мне не нужно будить все ожидающие нити, мне будет достаточно одной. А если мне нужно, что бы все нитки завершились, то я устанавливаю флаг и прошу проснутся всех. У семафоров такой возможности нет.