Problem producent-konsument (semafory, monitory)

0

Witam.

Wyobraźmy sobie bufor (pamięć współdzielona - IPC), z którego korzystają różne wątki/procesy, czyli producenci i konsumenci. Jest to bufor typu LIFO. Producenci dodają nowe pozycje do bufora na koniec, konsumenci pobierają również z końca.

Czy możliwe jest napisanie takiego programu, aby producent i konsument mogli jednocześnie do tego bufora pisać/czytać, czyli aby producent i konsument nie byli między sobą zsynchronizowani poprzez sekcję krytyczną? Jeśli tak, to czy program ten gwarantuje niezawodność (brak wyścigów, hazardów itp.)?

Pytam, ponieważ laborant prowadzący zajęcia z moją grupą twierdzi, że jest to możliwe, że jest to istota problemu producent-konsument.

Pozdrawiam.

0

Na wikipedii pod adresem http://pl.wikipedia.org/wiki/Problem_producenta_i_konsumenta zamieszczony jest taki kod:

semaphore pełny = 0
semaphore pusty = ROZMIAR_BUFORA

procedure producent() {
    while (true) {
        produkt = produkuj()
        down(pusty)
        dodajProduktDoBufora(produkt)
        up(pełny)
    }
 }

procedure konsument() {
    while (true) {
        down(pełny)
        produkt = pobierzProduktZBufora()
        up(pusty)
        użyjProdukt(produkt)
    }
}

oraz komentarz pod spodem:

Powyższe rozwiązanie działa poprawnie w przypadku, gdy istnieje tylko jeden producent i tylko jeden konsument. W czasie działania wielu procesów, może dojść do próby jednoczesnego odczytania bądź zapisania produktu w buforze w tym samym miejscu.

Moje pytanie: dlaczego ten kod działa dla jednego producenta i konsumenta? Przecież operacje dodajProduktDoBufora(produkt) oraz pobierzProduktZBufora() nie mogą być atomowe, ponieważ muszą zawierać przynajmniej dodanie/pobranie do/z bufora oraz inkrementację/dekrementację licznika, czyli co najmniej 2 instrukcje. Jeśli przełączenie kontekstu procesora nastąpi między tymi instrukcjami, to możemy mieć przewalone...

0

Dziękuję za odpowiedzi. Już po sesji :)

0

poniewaz atomowe sa semafory down i up i to one blokuja dostep do zasobow. czyli bufora.

0

@pas_:
Jego sesja skończyła się 3 lata temu. Teraz ma to głęboko ... zapewne.

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