295
восстанавливает потребленный им ресурс), и включается в список
читателей. После завершения доступа читатель обращается к входной
точке endRead (строка 23). Эта процедура исключает процесс из списка
читателей, уменьшает счетчик читателей и, если читателей больше не
осталось, сигнализирует разрешение на запись.
Писатель регистрируется/разрегистрируется через входные точки
startWrite/endWrite (строки 32/43). При регистрации
потенциальный писатель может быть заблокирован, если в настоящий
момент зарегистрирован другой писатель или хотя бы один читатель
(строка 35). Сигнал mayWrite разблокирует писателя, и он включается в
обе группы (строки 39, 40), так как имеет право и читать, и писать. При
откреплении писатель исключается из групп. Если за время его работы
попытался зарегистрироваться хотя бы один читатель, выдается
разрешение на чтение (строка 50), в противном случае – разрешение на
запись для другого писателя, возможно, ждущего своей очереди (строка
52).
8.10. Примитивы синхронизации в языках
программирования
До сих пор мы рассматривали методы, которые обеспечивают и
взаимное исключение, и синхронизацию. Целый ряд прикладных задач,
однако, требует только синхронизации без взаимного исключения. Отказ
от последнего, если это не мешает решению задачи, всегда оправдан, так
как взаимное исключение усложняет решение и может снижать уровень
мультипрограммирования.
Один из возможных примитивов, обеспечивающих синхронизацию
без взаимного исключения, называется счетчиком событий. Счетчик