Problem czytelników i pisarzy

0

Witam!
Mam za zadanie rozwiązać problem czytelników i pisarzy na trzy sposoby:
a) z zagłodzeniem pisarzy
b) z zagłodzeniem czytelników
c) poprawne rozwiązanie
Dwa pierwsze udało mi się już stworzyć, potrzebuje jedynie algorytmu c) nie chce gotowca.
Szukałem na google ale tam albo już gotowe programy, których nie chce analizować, albo krótki opis problemu.
Mile widziany byłby również pseudokod.
Dzięki za każdą pomoc.

0

No dobra ale o co chodzi? Dlaczego chcesz glodzic tych ludzi? Nie byloby humanitarniej kulka w leb?

0

Przede wszystkim musisz wiedzieć, co to jest przekazywanie sekcji krytycznej - ktoś jest w sekcji i wychodząc z niej nie zwalnia jej, ale przekazuje ją komuś innemu. Ten "inny" musi później zwolnić sekcję lub przekazać ją dalej.

Natomiast algorytm c wygląda tak:
-gdy pisarz kończy pisać, to jeśli nie ma czytelników, to zwalnia sekcję, wpp. przekazuje sekcję WSZYSTKIM czekającym czytelnikom
-w kolejce do sekcji nie czeka żaden pisarz <==> nowi czytelnicy mogą dołączyć się do czytelników znajdujących się w sekcji
-gdy sekcję opuszcza ostatni czytelnik, to albo przekazuje ją JEDNEMU pisarzowi(jeśli jest), albo ją zwalnia(jeśli nie ma pisarza)

No dobra ale o co chodzi? Dlaczego chcesz glodzic tych ludzi? Nie byloby humanitarniej kulka w leb?
:-D

0

Dzięki,
Jak będę miał z tym problemy to jeszcze sie odezwę :P

0

Oto co wymyśliłem, nie jestem pewny czy to wszystko ok, wiec będę wdzięczny za jakieś poprawy
Opis:
lp = liczba procesów czeka w kolejce do pisania
lc = liczba procesów oczekujących na czytanie
w2 - zabezpiecza modyfikacje zmiennej lp
w1 - zabezpiecza modyfikacje zmiennej lc
sp - zabezpiecza sekcje krytyczna dla procesu piszącego
czyt - zabezpiecza sekcje krytyczna dla procesu czytającego.

pisarz:

petla:
 wait(w2)
  lp++
 signal(w2)
 wait(sp)
   sekcja_krytyczna
 wait(w2)
   lp-- 
   wait(w1)
     if (lc=0) signal(sp) else czyt=LC
   signal(w1)
 signal(w2)
loop petla

czytelnik:

petla:
 wait(w3)
 wait(sc)
 wait(w1)
  lc++
  wait(w2)
  if(lp=0) signal(czyt)
  signal(w2)
 signal(w1)
 signal(sc)
 signal(w3)
 wait(czyt)
  sekcja_krytyczna
 wait(w1)
  lc--
  wait(w2)
  if (lc=0 && lp>0) signal(sp)
  signal(w2)
 signal(w1)
loop petla

Juz sobie poradziłem, w każdym razie dzieki za pomoc, powyższy algorytm nie był dobrym rozwiązaniem, miał kilka niedociagniec.

1 użytkowników online, w tym zalogowanych: 0, gości: 1