współbieżność

0

Hej,
Jakie problemy współbieżne wystąpią i w jaki sposób je rozwiązać w zadaniu symulującym prom rzeczny i korzystających z niego użytkowników (samochody).
Proszę o pomoc ;)

0

Ja to z grubsza widzę tak - jest sobie dowolna liczba samochodów, i każdy może w dowolnym momencie zakupić bilet na prom. I może to zrobić, dopóki jest jeszcze wolne miejsce. A jak już nie ma miejsca, to się dzieje jakaś czasochłonna rzecz (przepłynięcie promem).

Jeśli tak, to myślę, że metoda która jest odpowiedzialna za "kupienie" biletu na prom, powinna być synchronized (albo mieć locka na czymś). Drugą opcją, jest użycie np BlockingQueue.

Chociaż głowy nie dam, że to o to chodzi.

0

Czy transport jest jednostronny? I odbywa sie kiedy wszystkie bilety zostana sprzedane lub minie timeout?

Jesli tak to chyba jest problem podwojnej bariery (wpusc n watkow, zamknij wejscie ale otworz wyjscie)

0

Możesz to chyba rozwiązać stosując semafory, ale nie jestem pewny. Przynajmniej ja bym tak to próbował zrobić, gdyby mi kazali zrobić np. na rekrutacji.

1

Najpierw podaj dokładna treść zadania, to może pojawia się sensowne wskazówki. Póki co to koledzy chyba korzystają ze szklanej kuli :)

0

To takie zadanie na myślenie, sam musisz sobie dopowiedzieć brakujące warunki i spróbować rozwiązać np:
Samochody to wątki, które wykonują w pętli sekcję lokalną (jeździ gdzie chce) i sekcję krytyczną czyli chcą skorzystać z promu. Prom to wspólny zasób, o określonej pojemności N.
Problemy:

  1. na prom nie może wjechać więcej niż N aut,
  2. gdy prom płynie auta zgłaszające muszą czekać (lub zrezygnować i próbować później w bardziej ambitnym rozwiązaniu)
  3. auta płynące też są zablokowane na czas podróży

W tym zadaniu masz problem synchronizacji (zajmowanie miejsc na promie musi być synchronizowane, żeby nie wjechało więcej niż N aut) i koordynacji, czyli wstrzymywania wątków (wait()) po wjechaniu na prom i wybudzania (notifyAll()) po dotarciu do brzegu. Implementować to możesz np. semaforem o N zezwoleniach, choć chyba najłatwiej definiować klasę Prom jako monitor z metodami:

  1. protokół wstępny - rezerwacja miejsca - metoda publiczna synchronizowana, którą wywołują wątki aut i w której następuje wstrzymanie wątku
  2. rejs - metoda prywatna, która zostanie wywołana przez klasę Prom, gdy spełniony zostanie warunek rozpoczęcia rejsu np. zajęto wszystkie miejsca lub przyszedł czas rozpoczęcia rejsu i trwa przez określony czas.
  3. protokół końcowy - metoda prywatna, zejście z promu, wywoływana automatycznie po zakończeniu rejsu, w której muszą zostać wybudzone wątki i zwolnione miejsce na promie.
    W środku klasy Prom możesz wykorzystać BlockingQueue do przechowywania przewożonych aut, wtedy odpada Ci stosowanie niskopoziomowych wait() i notifyAll()

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