В статье Википедии, на которую есть ссылка в вашем вопросе , есть примечание , в котором говорится:
This is the standard "wait" operation on condition variables, which, among other actions, releases the mutex m.
Стандартное ожидание для функций условных переменных обычно принимает два параметра: условную переменную и мьютекс. Мьютекс m
освобождается функцией ожидания, и поток спит до тех пор, пока c
не сообщит . Блокировка m
повторно получается (что может включать ожидание, если блокировка была получена в другом месте), как только сигнализируется c
и поток продолжается.
Установка (глобального) флага w
в значение true указывает, что блокировка записи в настоящее время запрашивается потоком записи.
Mutex m
блокируется только при согласовании критической секции установки или освобождения состояний чтения / записи путем изменения условной переменной c
, целого числа r
(количество читателей, ожидающих), флага w
(писатель ждет).
Псевдокод, который вы разместили для получения блокировки чтения (которая фактически получает блокировку записи, то есть Set w to true
), использует как мьютекс (m
), так и условную переменную (c
). Во-первых, он пытается получить эксклюзивную блокировку мьютекса m
, чтобы модифицировать соответствующие входы атомарным способом. Как только это достигнуто, он вызывает wait c, m
, если w
(блокировка записи) или r
(ожидание читателей) отличны от нуля.
Подведем итог: