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