Представим себе сложный объект управления, например летательный аппарат или робот-манипулятор, управляемый цифровой системой управления. Как правило, в этих случаях используется система из нескольких приводов. Для управления каждым приводом имеется свой управляющий процесс, рассчитывающий значение управляющего сигнала. В то же время, имеются датчики, предоставляющие информацию о текущем состоянии объекта управления. Так как информация с датчиков может потребоваться сразу нескольким управляющим процессам, ввод информации, как правило, осуществляется специальными процессами. Эти процессы получают информацию с датчиков и помещают их в ЗУ для того, чтобы управляющие процессы могли затем, обратившись к ЗУ, получить эту информацию (рис. 1).
Рис. 1.  
Таким образом, мы имеем несколько процессов, записывающих информацию с общее ЗУ и несколько процессов, читающих информацию из общего ЗУ. Процессы первого типа получили название "процессов-писателей", процессы второго типа — "процессов-читателей". Процессы-писатели получают данные с датчиков и записывают в ЗУ, процессы-читатели читают данные из ЗУ и используют их для решения задачи управления.
Совершенно очевидно, что все процессы обращаются к общему ресурсу — ЗУ. Следовательно, должна быть предусмотрена их синхронизация. Правила синхронизации следующие:
Таким образом, должна быть решена задача взаимоисключения между читателями и писателями с одной стороны, и между различными писателями – с другой стороны. Такая задача может быть решена с помощью монитора ресурсов. Рассмотрим пример такого монитора.
Пример 1
Program Monitor 2;
var Read_perm, Write_perm : condition;
    Read_Queue, Write_Queue, Somb_write  : boolean;
    Readers : integer;

Procedure Start_Read;
begin
  If (Somb_Write Or WriteQueue) then Wait(Read_Perm);
  Readers:=Readers+1;
end;

Procedure Finish_Read;
begin
  Readers:=Readers-1;
  If (Readers=0) then Signal(Write_Perm);
end;

Procedure Start_Write;
begin
  If (Readers>0 Or Somb_Write) then Wait(Write_Perm);
  Somb_Write:=True;
end;

Procedure Finish_Write;
begin
  Somb_Write:=False;
  If Read_Queue then Signal(Read_Perm) else Signal(Write_Perm);
end;

begin
  Readers:=0;
  Somb_Write:=False;
  Read_Queue:=False;
  Write_Queue:=False;
end.
По сути дела, в этом мониторе доступ по чтению и записи в ЗУ рассматриваются как два отдельных ресурса. Соответственно, мы имеем две пары процедур: Start_Read и Finish_Read для доступа по чтению, Start_Write и Finish_Write для доступа по записи.
Глобальные переменные:
Процедуры монитора:
Данный монитор обеспечивает приоритет "писателей" над "читателями". Это необходимо для того, чтобы вся информация, полученная "писателями" с датчиков, была записана в ЗУ. С другой стороны, ни один "читатель" не пропустит информацию, выданную ему "писателем".