Problem producenta i konsumenta
W problemie producenta i konsumenta występują dwa rodzaje procesów: producent i konsument, którzy dzielą wspólny zasób - bufor dla produkowanych (konsumowanych) jednostek. Zadaniem producenta jest wytworzenie produktu, umieszczenie go w buforze i rozpoczęcie pracy od nowa. W tym samym czasie konsument ma pobrać produkt z bufora. Problemem jest taka synchronizacja procesów, żeby producent nie dodawał nowych jednostek gdy bufor jest pełny, a konsument nie pobierał gdy bufor jest pusty.

Opis rozwiązania
Rozwiązaniem dla producenta jest uśpienie procesu w momencie gdy bufor jest pełny. Pierwszy konsument, który pobierze element z bufora budzi proces producenta, który uzupełnia bufor. W analogiczny sposób usypiany jest konsument próbujący pobrać z pustego bufora. Pierwszy producent, po dodaniu nowego produktu umożliwi dalsze działanie konsumentowi. Nieprawidłowe rozwiązanie może skutkować zakleszczeniem.
Pseudokod rozwiązania
int BUFFER[BUFFER_SIZE]
int ilosc_producentow
int ilosc_konsumentow
mutex buffer_mutex
semafor zapelnione_miejsce // inicjalizuj 0
semafor wolne_miejsce // inicjalizuj BUFFER_SIZE
producent() {
    while (1) {
        // Produce item
        item = produce_item
        sem_(&wolne_miejsce)
        lock_mutex(&buffer_mutex)
        // Wstaw przedmiot do bufora
        wstaw_przedmiot(item)
        unlock_mutex(&buffer_mutex)
        post(&zapelnione_miejsce)
    }
}
konsument() {
    while (1) {
        sem_(&zapelnione_miejsce)
        lock_mutex(&buffer_mutex)
        // Pobierz przedmiot z bufora
        item = pobierz_przedmiot()
        unlock_mutex(&buffer_mutex)
        post(&wolne_miejsce)
        // Consume item
    }
    return 0
}