Да и, по большому счёту, если использовать не ж/д-терминологию, то удачнее употребить было бы "мьютекс" или "критическая секция". Т.к. семафор это более для общественных туалетов (на несколько "посадочных мест"). Последнее (крит.сек.) особенно актуально, учитывая что мы жили в номерах по двое, а значит алгоритм работы примитива (если б таковой был) сводился бы к: подёргай ручку и узнаешь. Это взаимодействие ориентированно на быструю скорость работы из-за отсутствия необходимости перехода в режим ядра (использование interlocked-функций, реализующих атомарное взаимодействие с флагами контроля), оправдано при малой вероятности коллизии (всего два человека!). В то время, как например в вагонах поездов (постоянно занято!) сейчас устанавливают световую сигнализацию (замыкаемую замком туалета) - это уже мьютекс: процесс, пытающийся захватить сортир не дёргает ручку (каждый вновь подошедший!), а переключается на визуальный контроль индикатора. Причём, все стоящие в очереди узнают об изменении состояния туалета одновременно (со скоростью света). Далее, первый стоящий в очереди должен пойти в туалет. Хотя на практике это не всегда так (например, приоритеты: "пустите меня - а то прям здесь облегчусь!!111")
Кроме того, в гостинице можно подходить к запертой двери каждые x минут и дёргать ручку и ныть "ну скоро ты там?" - это уже спинблокировка (
InitalizeCriticalSectionAndSpinCount). По прошествии некоторого времени просящий засыпает, переходя из пользовательского режима. Опять-таки, можно дёрнуть ручку, и в случае неудачи - начать выполнять иную деятельность (
TryEnterCriticalSection), в то время как в вагоне для этого надо переключить взгляд на индикатор и подождать 0 мсек (
WaitForSingleObject с нулевым ожиданием).
Аналогии, разумеется, притянуты за уши.