Составители:
Рубрика:
receive op(v_1, . . ., v_n)
Введем еще операцию empty(), которая не имеет аргумен-
тов, и вызывается оператором send, а обслуживается оператором
receive.
Такая операция эквивалентна семафору, где send выступает в
качестве V, а receive — в качестве P. Начальное значение семафора
равно нулю. Его текущее значение, это число “пустых” сообщений,
переданных операции, минус число полученных сообщений.
В следующей программе буфера для реализации исключения
использованы семафоры.
КОЛЬЦЕВОЙ БУФЕР С СЕМАФОРАМИ
module BoundedBuffer
op deposit(type T), fetch(result type T);
body
type T buf[n];
int front=1, rear=1;
# локальные операции для имитации семафоров:
op empty(), full(), D(), F();
send D(); send F();
for [i=1 to n] # инициализация пустого "семафора"
send empty();
proc deposit(item){
receive empty(); receive D();
buf[rear]=item; rear=(rear+1) mod n;
send D(); send full();
}
proc fetch(item) {
receive full(); receive F();
item=buf[front]; front=(front+1) mod n;
send F(); send empty();
}
end BoundedBuffer
91