Реализация предпочтительной записи R / W блокировки - PullRequest
0 голосов
/ 30 июня 2018

У меня есть библиотека мьютекса, и я пытаюсь реализовать блокировку, предпочитающую запись. Я смотрю на этот пример:

https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock

Я понимаю блокировку, предпочитающую чтение, но не понимаю блокировку, предпочитающую запись. Может кто-нибудь объяснить, как это реализовать?

В частности, я не понимаю эту часть:

While w:
  wait c, m

Я также не понимаю, является ли флаг w универсальным или просто другим флагом для процесса. Я предполагаю, что это первое.

Например, здесь мы видим алгоритм получения блокировки чтения:

Lock m (blocking).
While (w or r > 0):
  wait c, m
Set w to true.
Unlock m.

а что значит wait c, m? Это не может означать ожидание блокировки на c и m, потому что мы уже заблокировали m на шаге 1.

А также, для Set w to true - означает ли это, что w должно быть установлено в true во всех процессах или только в этом процессе?

1 Ответ

0 голосов
/ 10 июля 2018

В статье Википедии, на которую есть ссылка в вашем вопросе , есть примечание , в котором говорится:

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 (ожидание читателей) отличны от нуля.

Подведем итог:

  • функция «wait» принимает два параметра: c и m. Он выпускает m и спит до получения сигнала на c.

  • мьютекс m блокируется при установке или снятии блокировки чтения или записи.

...