.
, , , .
. , , , , .
3.1.12.2
, , .
. VAR V: SHARED T; , . REGION V DO S.
VAR R: SHARED T1;
Q: SHARED T2;
Begin
Parbegin
1:... L1: REGION R DO S1;...
2:... L2: REGION Q DO S2;...
...........
i:... Li: REGION R DO S3;...
Parend;
End.
1- i- R .
V: SHARED T , V, , . T.
V REGION V DO S. V S, . .
, , - , REGION. .
TYPE T = ARRAY 1..100 OF INTEGER;
VAR M: SHARED T;
Begin
Parbegin
1: L1: < >
REGION M DO < M>;
GOTO L1;
..................
N: Ln: < >
REGION M DO < M>;
GOTO Ln;
Parend;
End.
. , , .
|
|
AWAIT. REGION. . , , REGION. AWAIT , , . . , .
:
- , , ;
- , , , , , AWAIT .
, , - - .
TYPE T = ARRAY 1..100 OF INTEGER;
VAR M: SHARED T;
: BOOLEAN;
BEGIN
:=TRUE;
PARBEGIN 1: begin
m1: < >
Region m do begin
Await();
< >
:= true;
End;
Goto m1;
End;
2: begin
m2: < >
Region m do begin
< >
:= false;
End;
Goto m2;
End;
Parend;
End.
, .
- , .
. , , .
( )
, REGION AWAIT COUSE , .
VAR E: EVENT R.
, R.
. , AWAIT.
COUSE - , E, .
|
|
. . COUSE.
.
R, M . R . , , . R. , .
BEGIN
TYPE RES = 1..M, P = 1..N;
VAR INF: SHARED RECORD
_: sequence of res;
: queue of p;
_: array p of event r;
end;
procedure reserve(: p; var : res)
begin
region inf do begin
while empty(_) do
begin
enter(, );
await(_());
end;
GET (, _);
end;
procedure release(: res)
begin
var : ;
region inf do
begin
put(, _);
if (not empty()) then
begin
remove(, );
couse(_());
end;
end;
end;
parbegin
M1: begin
VAR R1:RES;
m1: < >
Reserve(1, var r1);
< r ,
r1>
release(r1);
goto m1;
end;
...
MN: begin
VAR RN:RES;
m1: < >
Reserve(N, var rN);
< r ,
rN>
release(r1);
goto mN;
end;
parend;
end.
R, , , , . INF, , . _ SEQUENCE (), RES. . 1 M. GET PUT.
GET (1- ) SEQUENCE FIFO;
PUT GET. PUT FIFO SEQUENCE , .
. QUEUE (). , 1 N, N , .
, . . 1 N, . ENTER REMOVE. FIFO, .
EMPTY, .
_ , . i i- .
|
|
RESERVE ( ) RELEASE ( _).
RESERVE , , .
RELEASE , , . , , .
INF, .
RESERVE, . INF.
, , , , AWAIT _.
, , , . _. , , , , - .
, _. , . , , _ .
, . INF. . , , .
, . .