Составители:
Рубрика:
# запросить еще символ из West и
# выдать предыдущий символ в East
c1=c2; # - переприсвоить символы
[ ] East!c1 --> West?c1; # - выдать символ в East и
# запросить символ из West
od
}
Процесс может заблокироваться и на East (если не готов принять)
и на West (если не готов выдать запрос).
Здесь обе защиты всегда пропускают и потому цикл никогда
не завершается; однако, время от времени он может блокировать-
ся. Если обе защиты не блокируют, то выполняется любая ветвь
(недетерминирование).
3. Третий пример. Реализацию кольцевого буфера можно полу-
чить, реализуя программу Copy в виде
process Copy {
char buffer[10];
int front=0, rear=0, count=0;
do count<10 West?buffer[rear] -->
count=count+1; rear=(rear+1) mod 10;
[ ] count>0; East!buffer[front] -->
count=count-1; front=(front+1) mod 10;
od
}
Здесь используется оператор do с двумя ветвями, но теперь в защи-
тах имеются и логические выражения и операторы взаимодействия.
Защита в первой ветви пропускает, когда в буфере есть сво-
бодное место, и эта защита не блокирует, если процесс West готов
вывести запрашиваемый символ (в конец заполняемог о буфера), а
защита во второй ветви пропускает, е сли в буфере есть символы и
процесс East готов получить символ (из начала массива заполнен-
ного буфера).
Цикл здесь тоже никогда не завершается, ибо хотя бы одно из
логических значений истинно.
56
Страницы
- « первая
- ‹ предыдущая
- …
- 53
- 54
- 55
- 56
- 57
- …
- следующая ›
- последняя »