@Sn3jku: Pomyślałem już o tym. Chciałem zrobić to tak:

- jeden semafor (full) inicjowany zerem mówi ile jest zajętych miejsc w buforze,

- jeden semafor (empty) inicjowany maksymalną pojemnością bufora, mówi ile jest zajętych miejsc w buforze,

- jest jeden mutex synchronizujący dostęp do bufora.

Standardowo to by było tak (up - podniesienie semafora, down - opuszczenie):

produce(int i)

{

down(empty);

down(mutex);

//wstawienie do bufora

up(mutex);

up(full);

}

int consume()

{