ВУЗ:
Составители:
74
void put()
{ if(count == N) full.wait;
put_item;
count += 1;
if(count == 1) empty.signal;
}
void get()
{ if (count == 0) empty.wait;
get_item();
count -= 1;
if(count == N-1) full.signal;
}
}
Producer: while(1)
{ produce_item;
ProducerConsumer.put();
}
Consumer: while(1)
{ ProducerConsumer.get();
consume_item;
}
Функция монитора выполняет операцию wait над какой-либо
условной переменной. При этом процесс, выполнивший операцию wait,
блокируется, становится неактивным, и другой процесс получает воз-
можность войти в монитор.
Когда ожидаемое событие происходит, другой процесс внутри
функции совершает операцию signal над той же самой условной пере-
менной. Это приводит к пробуждению ранее заблокированного процес-
са, и он становится активным.
Отличительной особенностью мониторов является то, что исклю-
чение входа нескольких процессов в монитор реализуется не програм-
мистом, а компилятором, что делает ошибки менее вероятными. Реали-
зация мониторов требует использования специальных языков програм-
мирования и компиляторов для них (например, «параллельный Евклид»,
«параллельный Паскаль», Java).
Следует отметить, что эмуляция семафоров значительно проще
эмуляции мониторов – в отличие от семафоров Дейкстры, условные пе-
ременные мониторов не запоминают предысторию, поэтому операция
signal всегда должна выполняться после операции wait. Если операция
signal выполняется над условной переменной, с которой не связано ни
одного заблокированного процесса, то информация о произошедшем
событии будет утеряна, и выполнение операции wait всегда будет при-
водить к блокированию процесса.
Страницы
- « первая
- ‹ предыдущая
- …
- 72
- 73
- 74
- 75
- 76
- …
- следующая ›
- последняя »
