-
-
-
CENAPAD-MGCO
A seguir: Exemplo
Acima: Carvalho e Roucairol (1983)
Anterior: Carvalho e Roucairol (1983)
PROCEDURE Release();
VAR j: CARDINAL;
BEGIN
lock(mutex);
Eating := FALSE; Thinking := TRUE;
FOR j := 1 TO n DO
IF Deferred[j] THEN
A[j] := FALSE; Deferred[j] := FALSE;
send(release(i),j);
unlock(mutex);
END Release;
PROCEDURE ReceiveRequest(Tk, k: CARDINAL);
VAR OurPriority: BOOLEAN;
BEGIN
lock(mutex);
HSN := MAX(HSN, Tk);
OurPriority := (Tk > OSN) OR
((Tk = OSN) AND (k > i));
IF Eating OR (Hungry AND OurPriority) THEN
Deferred[j] := TRUE;
ELSE /* Eating = FALSE, Hungry => NOT OurPriority */
send(release(i),j);
IF Hungry AND A[j] THEN send(request(OSN,i),j);
A[j] := FALSE;
END;
unlock(mutex);
END ReceiveRequest);
PROCEDURE ReceiveRelease(k: CARDINAL);
BEGIN
lock(mutex);
A[k] := TRUE; WakeUp(B, mutex);
unlock(mutex);
END ReceiveRelease;