mutex 1
защищает переменную readcount
;mutext 2
защищает writecount
переменная;mutex r
защищает операции чтения, а mutext w
защищает операции записи.
1) Предположим, что пишущий вводит:
Сигналы mutex 2
и увеличивает writercount
к учетной записидля дополнительного записывающего (самого себя) Поскольку это единственный процесс, который может изменить writercount
(поскольку он содержит mutex 2
), он может безопасно проверить, является ли он единственным записывающим устройством (writercount==1
), если true, он сигнализируетмьютекс r
для защиты читателей от проникновения - другие авторы (writercount > 1
) могут наслаждаться мьютексом r
, уже сигнализируемым.
Затем автор сообщает мьютексу w
, чтобы защитить его изменения от других(одновременные) писатели.
Последний писатель (writecount==1
) выпускает мьютекс r
, чтобы позволить читателям выполнять свои задачи.
2) Предположим, что читатель входит:
Сигналы mutex 3
для защиты логики настройки считывателей от других считывателей;затем сигнализирует мьютекс r
для защиты от других авторов (помните, что r
сигнализируется во время работы авторов);затем сигнализирует mutex 1
о защите счетчика чтения (от других читателей, которые могут выходить из него) и, если это первый считыватель (readercount == 1
), сигнализирует мьютекс w
о защите от писателей (теперь исключает писателей из выполнения их операций).
Чтение может выполняться параллельно, поэтому не требуется никакой защиты от других читателей во время чтения (помните, мьютекс w
удерживается на этом этапе, поэтому нет вмешательства со стороны писателей)
Тогда последнийчитатель сбрасывает мьютекс записи (w
), чтобы разрешить писателям.
Хитрость, которая предотвращает голодание писателя, заключается в том, что писатели изображают из себя читателей (при сигнале мьютекса p
), поэтому у них есть хороший шанспланировать, даже когда есть много читателей.Кроме того, mutex 3
не позволяет слишком большому количеству читателей ожидать мьютекс r
, поэтому у писателей есть хорошие шансы сообщить r
, когда они придут.