Algorytm Piekarniany

0

Witam napisałem algorytm współbieżny ale nie działa jak powinien. Mogę liczyć na jakąś pomoc??

zamiast wyniku:
Proces 1 wszedł do sekcji krytycznej
Proces 2 wszedł do sekcji krytycznej
Proces 1 wszedł do sekcji krytycznej
Proces 2 wszedł do sekcji krytycznej
jest:
Proces 2 wszedł do sekcji krytycznej
Proces 2 wszedł do sekcji krytycznej
Proces 2 wszedł do sekcji krytycznej
itd
Proces 1 wszedł do sekcji krytycznej
Proces 1 wszedł do sekcji krytycznej
Proces 1 wszedł do sekcji krytycznej

0

Po pierwsze: doczytaj co to jest sekcja krytyczna ;p Bo ja tu zadnej nie widze. I wg mnie bedziesz mial tu wyscigi, az milo :> uzyj metod notify()/wait() albo slowa synchronized (bloku synchronized) albo innych metod synchronizacji dostepu...

0

A jakoś pokazac mi na moim programie bo za bardzo nie wiem jak się za to zabrać:/

0

Pokażę Ci tak:

private int i = 0;
private int j = 0;
private Object blokada = new Object();
...
public void metodaUzywanaPrzezKilkaWatkow() {
  i = i + 1;
  synchronized (blokada) {
    j = j + 1;
  }
}

Po wykonywaniu tej metody przez wiele watkow (przy dostatecznie duzym obciazeniu) wartosci i oraz j beda rozne. J bedzie pokazywac prawdziwa wartosc okreslajaca ilosc wywolan metody, natomiast i bedzie pokazywalo wartosc mniejsza (ze wzgledu na wyscigi).
To, co na powyzszym przykladzie, znajduje sie w sekcji synchronized() to wlasnie sekcja krytyczna. Wewnatrz niej moze sie na raz znajdowac tylko jeden watek. Innymi slowy kod, ktory tam jest, bedzie sie wykonywal "atomowo".

0

Rozumiem. Ale mi chodzi bardziej na implementacji tego algorytmu dla dwóch procesów niż robienie coś w sekcji krytycznej.

0

Ech, czlowieku - ogarnij podstawy. WSZEDZIE, GDZIE WIECEJ, NIZ JEDEN WATEK MODYFIKUJE/UŻYWA (czyli tez odczytuje) WARTOSCI WSPOLDZIELONYCH ZMIENNYCH MUSI BYC UZYTA SEKCJA KRYTYCZNA DO OPEROWANIA NA TYCH ZMIENNYCH.

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