Bufor ma miejsce na N elementów. Zapisywane są w nim

Transkrypt

Bufor ma miejsce na N elementów. Zapisywane są w nim
Bufor ma miejsce na N elementów. Zapisywane są w nim pojedyncze litery i odstępy (spacje). Procesy
zapisują do bufora wyrazy składające się z liter (max. M liter). Wyraz kończy się spacją. Zapisać
można tylko pełne słowo wraz ze spacją końcową (jeżeli w buforze nie zmieści się pełne słowo + spacja,
to zapis nie może być dokonany). Pełne słowa są odbierane przez procesy czytające, przy czym
parametrem odczytu jest maksymalna wielkość słowa która może zostać odczytana. Należy użyć
monitorów.
type bufor_slow=monitor (N:int);
var buf:array[0..N-1] of char;
//bufor
pusty,pelny:array[2..M+1] of condition; //czekamy na warunkach
wolny,zajety:0..N-1;
//jak to w buforze
ile:0..N;
//ile znaków w buforze
procedure put (s:string);
var L,i:natural;
begin
s:=s+' ';
//dodajemy spację
L:=dlugosc(s);
//funkcja zwraca długość słowa
if (L>M+1) then exit;
//nie spełnia warunków zadania
if L>(N-ile) then pelny[L].wait;
//staje gdy za mało miejsca
for i:=1 to : do begin
//wstawia słowo
buf[wolny]:=s[i]; wolny:=(wolny+1) mod N end;
repeat
znal:=false;
//na razie brak chętnych
L:=dlugosc_w_buf;
//funkcja zwraca długść
//pierwszego słowa z buforze
if L>0 then for i:=2 to L do
//szukamy od najkrótszych
if not znal and not pusty[i].empty then begin
znal:=true;
pusty[i].signal
//znaleziono chętnego
end
until not znal
//jeżeli znaleziono chętnego o może być następny ale dla niego znów pobieramy
//długość pierwszego słowa
end;
procedure get (dl:int; vat buf:dstring);
begin
if (dl>M) then exit;
//nie spełnia warunków zadania
L:=dlugosc_w_buf;
//funkcja zwraca długść pierwszego słowa z buforze (ze spacją); L=0 bufor pusty
if (L=0) or (dl<L-1) then pusty[dl].wait; //staje gdy bufor pusty lub za długie słowo
L:=dlugosc_w_buf;
//teraz już L nie może być 0
for i:=1 to L do begin
//wyjmuje słowo (bez spacji)
if i<L then buf[wolny]:=s[i];
wolny:=(wolny+1) mod N
end;
repeat
znal:=false;
//na razie brak chętnych
L:=ile_miejsca;
//fukcja zwraca ilość wolnego w buforze
if L>M+1 then L:=M+1;
//potrzebujemy tylko maksymalnie M+1 wolnego miejsca
if L>0 then for i:=2 to L do
//szukamy od najkrótszych
if not znal and not pelny[i].empty then begin
znal:=true;
pelny[i].signal
//znaleziono chętnego
end
until not znal
//jeżeli znaleziono chętnego to może być następny ale dla niego znów zbadamy
//ilość wolnego miejsca
end;
begin
ile:=0; wolny:=0; zajety:=0
end.