Rozwiązanie W rozwiązaniu poniżej używamy dwóch semaforów: pusty oraz pełny. Semafor pusty jest opuszczany przed dodaniem do bufora. Jeśli bufor jest pełny semafor nie może być opuszczony i producent zatrzymuje się przed dodaniem. W następnym uruchomieniu konsumenta semafor jest podniesiony, co umożliwia producentowi dodanie jednostki do bufora. Konsument działa w analogiczny sposób.

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)

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.

Zobacz też problem czytelników i pisarzy problem ucztujących filozofów

Bibliografia Wykłady z systemów operacyjnych (wazniak.mimuw.edu.pl) The Little Book of Semaphores, Allen B. Downey, wydanie 2

Kategoria:Programowanie równoległe