Реализация блокировки R/W с предпочтением записи

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

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

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

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

While w:
  wait c, m

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

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

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 во всех процессах или только в этом процессе?


person Community    schedule 29.06.2018    source источник
comment
Я перевел статью из Википедии о блокировке, предпочитающей запись, сюда: github.com/ORESoftware/live-mutex/blob/dev/docs/   -  person    schedule 30.06.2018
comment
Учитывая мой перевод, еще одна вещь, которая меня смущает, заключается в том, что кажется, что каждая операция должна блокировать m. Это означает, что читатели будут блокировать читателей, что не так уж и идеально.   -  person    schedule 30.06.2018


Ответы (1)


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

This is the standard "wait" operation on condition variables, which, among other actions, releases the mutex m.

Стандартное "ожидание" при условном переменные обычно принимают два параметра: условную переменную и мьютекс. Мьютекс m освобождается функцией ожидания и потоком бездействует до тех пор, пока не поступит сигнал c. Блокировка m повторно запрашивается (что может включать ожидание, если блокировка была получена в другом месте) после получения сигнала c и продолжения потока.

Установка (глобального) флага w в значение true указывает, что блокировка записи в настоящее время заявлена ​​потоком записи.

Мьютекс m блокируется только во время согласования критического раздела установки или освобождения состояний чтения/записи путем изменения переменная условия c, целое число r (количество ожидающих чтения), флаг w (ожидание записи).

Псевдокод, который вы разместили для получения блокировки чтения (который на самом деле получает блокировку записи, таким образом, Set w to true), использует как мьютекс (m), так и условная переменная (c). Во-первых, он пытается получить эксклюзивную блокировку мьютекса m, чтобы модифицировать соответствующие входные данные атомарным образом. Как только это достигнуто, он вызывает wait c, m, если w (блокировка записи) или r (ожидание чтения) не равны нулю.

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

  • функция ожидания принимает два параметра: c и m. Он освобождает m и засыпает, пока не получит сигнал на c.

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

person Chris Slothouber    schedule 10.07.2018