Programowanie współbieżne i rozproszone/PWR Ćwiczenia 8: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
Nie podano opisu zmian |
||
| Linia 52: | Linia 52: | ||
Pisarze : semaphore := 0; | Pisarze : semaphore := 0; | ||
process Czytelnik; | process Czytelnik; | ||
begin | begin | ||
while true do begin | while true do begin | ||
wlasne_sprawy; | wlasne_sprawy; | ||
P( | P(mutex); | ||
if ilupisze + czekapis > 0 then | |||
begin | |||
czekaczyt := czekaczyt+1; | |||
V( | V(mutex); | ||
P(Czytelnicy); | |||
czekaczyt := czekaczyt-1 {dziedziczenie s.k} | |||
end; | end; | ||
iluczyt := iluczyt + 1; | |||
if czekaczyt > 0 then | |||
V(Czytelnicy) | |||
else | |||
V(mutex); | |||
CZYTAM; | CZYTAM; | ||
P( | P(mutex); | ||
iluczyt := iluczyt - 1 | |||
if | if (iluczyt = 0) and (czekapis > 0) then | ||
V(Pisarze) | |||
else | |||
V(mutex) | |||
end | end | ||
end; | end; | ||
process Pisarz; | |||
begin | |||
while true do begin | |||
wlasne_sprawy; | |||
P(mutex); | |||
if ilupisze + iluczyta > 0 then | |||
begin | |||
czekapis := czekapis+1; | |||
V(mutex); | |||
P(Pisarze); | |||
czekapis := czekapis-1 {dziedziczenie s.k} | |||
end; | |||
ilupis := ilupis + 1; | |||
V(mutex); | |||
PISZE; | |||
P(mutex); | |||
ilupis := ilupis - 1; | |||
if czekaczyt > 0 then | |||
V(Czytelnicy) | |||
else if czekapis > 0 then | |||
V(Pisarze) | |||
else | |||
V(mutex) | |||
end | |||
end; | |||
Wersja z 13:17, 3 paź 2006
- Zadanie
Zaimplementuj semafor dwustronnie ograniczony
var S : semaphore := K; {wartosc poczatkowa, 0 <= K <= N}
T : semaphore := N - K;
procedure PD; {operacja P na semaforze dwustronnie ograniczonym}
begin
P(S); V(T);
end;
procedure VD; {operacja V na semaforze dwustronnie ograniczonym}
begin
P(T); V(S);
end;
- Zadanie
Zaimplementuj semafor uogólniony. Zwróć uwagę na zachowanie własności żywotności.
procedure PG(n : integer); {operacja P na semaforze uogolnionym}
begin
P(pierwszy);
P(mutex);
if ile < n then
begin
naileczeka := n;
V(mutex);
P(czekaj);
naileczeka := 0;
end;
ile := ile - n;
V(mutex);
V(pierwszy)
end;
procedure VG(n : integer); {operacja V na semaforze uogolnionym}
begin
P(mutex);
ile:= ile + n;
if (naileczeka > 0) and (ile >= naileczeka) then
V(czekaj)
else
V(mutex);
end;
- Zadanie
Rozwiąz problem czytelników i pisarzy.
var iluczyta, czekaczyt, ilupisze, czekapis : integer := (0, 0, 0, 0);
mutex : binary semaphore := 1;
Czytelnicy : semaphore := 0;
Pisarze : semaphore := 0;
process Czytelnik;
begin
while true do begin
wlasne_sprawy;
P(mutex);
if ilupisze + czekapis > 0 then
begin
czekaczyt := czekaczyt+1;
V(mutex);
P(Czytelnicy);
czekaczyt := czekaczyt-1 {dziedziczenie s.k}
end;
iluczyt := iluczyt + 1;
if czekaczyt > 0 then
V(Czytelnicy)
else
V(mutex);
CZYTAM;
P(mutex);
iluczyt := iluczyt - 1
if (iluczyt = 0) and (czekapis > 0) then
V(Pisarze)
else
V(mutex)
end
end;
process Pisarz;
begin
while true do begin
wlasne_sprawy;
P(mutex);
if ilupisze + iluczyta > 0 then
begin
czekapis := czekapis+1;
V(mutex);
P(Pisarze);
czekapis := czekapis-1 {dziedziczenie s.k}
end;
ilupis := ilupis + 1;
V(mutex);
PISZE;
P(mutex);
ilupis := ilupis - 1;
if czekaczyt > 0 then
V(Czytelnicy)
else if czekapis > 0 then
V(Pisarze)
else
V(mutex)
end
end;