Programowanie wspóÅbieżne. Systemy czasu rzeczywistego - Helion
Programowanie wspóÅbieżne. Systemy czasu rzeczywistego - Helion
Programowanie wspóÅbieżne. Systemy czasu rzeczywistego - Helion
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
248 <strong>Programowanie</strong> wspóbiene. <strong>Systemy</strong> <strong>czasu</strong> <strong>rzeczywistego</strong><br />
procedure Je;<br />
end Czynnosci;<br />
package body Czynnosci is<br />
procedure Mysli is<br />
begin<br />
delay 2.0;<br />
end Mysli;<br />
procedure Je is<br />
begin<br />
delay 3.0;<br />
end Je;<br />
end Czynnosci;<br />
N: constant := 5;<br />
type Liczba_Filozofow is range 0..N - 1;<br />
task type Fil(P: Liczba_Filozofow);<br />
task type Kontrola_Widelcow is<br />
entry Podnies;<br />
entry Odloz;<br />
end Kontrola_Widelcow;<br />
Zapewnienie ywotnoci globalnej (brak blokady) jest realizowane poprzez negacj<br />
warunku cyklicznego czekania — dopuszczonych jest jedynie czterech filozofów do<br />
jednoczesnego wspózawodnictwa o dostp do widelców.<br />
task Brak_Blokady is<br />
entry Wchodzi;<br />
entry Opuszcza;<br />
end Brak_Blokady;<br />
type Filozof is access Fil;<br />
Widelce: array(Liczba_Filozofow) of Kontrola_Widelcow;<br />
Filozofowie: array(Liczba_Filozofow) of Filozof;<br />
-- pierwsze rozwizanie<br />
task body Kontrola_Widelcow is<br />
begin<br />
loop<br />
accept Podnies;<br />
accept Odloz;<br />
end loop;<br />
end Kontrola_Widelcow;<br />
task body Brak_Blokady is<br />
Max: constant Integer := N - 1;<br />
L_Jedzacy: Integer range 0..Max := 0; -- liczba jedzcych filozofów<br />
begin<br />
loop<br />
select<br />
when L_Jedzacy < Max =><br />
accept Wchodzi do<br />
L_Jedzacy := L_Jedzacy + 1;<br />
end Wchodzi;<br />
or<br />
accept Opuszcza do<br />
L_Jedzacy := L_Jedzacy - 1;<br />
end Opuszcza;<br />
end select;<br />
end loop;<br />
end Brak_Blokady;