Монитор — конструкция языка программирования, поддерживающая управляемый доступ к разделяемым данным. Монитор инкапсулирует:
- Разделяемые критические данные.
- Функции, использующие разделяемые данные.
- Синхронизацию выполнения параллельных потоков, вызывающих указанную функцию.
- Доступ к данным, располагающимся в мониторе, реализуется только из его функций.
- Код синхронизации добавляется автоматически компилятором.

Для каждого экземпляра монитора в каждый момент времени может выполняться не более одной функции.
Conditional Variables — условные переменные, олицетворяющие наступление некоторого события.
Над CV определены следующие операции:
wait(cv) — дождаться наступления события. На время ожидания блокировка с монитора снимается.
signal(cv) — оповестить один ожидающий поток о наступлении события.
broadcast(cv) — оповестить все ожидающие потоки о наступлении события.
Решение задачи «Производители-Потребители» с помощью мониторов.
Monitor CB;
Element Buffer[n]; int start=0, end=0;
Conditional Variable NotFull, NotEmpty;
Produce(el){
if (Буфер полон) wait NotFull;
Добавить(el);
signal NotEmpty;
}
Consume(*el){
if (Буфер пуст) wait NotEmpty;
*el=Извлечь();
signal(NotFull);
}
Мониторы Хаара if (усл) wait (cv);
При вызове signal:
- Немедленно запускается ожидающий поток.
- Поток, пославший сигнал, блокируется на все время, пока выполняется поток, которого он вывел из состояния ожидания.
+ Предсказуемость.
Мониторы Меса while (усл) wait (cv);
При вызове signal:
- Ожидающий поток переводится в состояние «Готов к выполнению». Поток, пославший сигнал, продолжает исполнение.
- При освобождении монитора поток, получивший сигнал, конкурирует с другими потоками за вход в монитор на равных условиях.
+ Более эффективны (используют меньшее кол-во переменных).
+ Непосредственно поддерживают broadcast.
Если вы получили сигнал, значит, возможно, состояние монитора изменилось.






