Wpis z mikrobloga

@nme: Ja bym nie robił nic blokującego - przynajmniej nie jako jedyną opcję. Raczej coś na styl

read()
i

select()
. Jeśli chodzi o zwrócenie wartości to errorkod albo wyjątek to praktycznie to samo, ale skoro #posix to raczej #jezykc niż #cpp, więc errorkod.
Znaczy sie piszesz program do obslugi relacji producent-konsument, ktory opierac sie ma na dwoch procedurach, a jedna z nich, consume, pobiera jako argumenty, zawartosc bufora, a w przypadku gdy bufor jest pusty zawiesza swoje dzialanie i prosisz o gotowe rozwiazanie/porady?
@nme: W takim razie nie rozumiem w czym problem. Jeśli musi być blokująca to program (a raczej wątek) zostaje "zawieszony" do momentu pojawienia się w buforze danych do odczytania.
Widzę, że jest problem ze zrozumieniem o co mi chodzi. Więc jeszcze raz:

- void produce(int product) - dodaje do bufora (np. tablicy o stałym rozmiarze, czytanej i pisanej cyklicznie) nową liczbę (product),

- int consume(int awaitedProduct) - sprawdza czy jest w buforze liczba awaitedProduct, a jeśli nie ma to się blokuje, do czasu gdy się pojawi. Jeśli jest, to po prostu ją zwraca.

Przykładowa sytuacja:

1. Produce: 2

2. Consume: 3
No to masz problem, bo albo nie możesz czyścić bufora (bo inny konsument może szukać obecnej liczby) albo musisz w każdym konsumencie sprawdzać wszystkie obecnie konsumowane liczby).

Btw, po co konsumer zwraca wartość? Zgodnie z tym co rozumiem, zwrócona wartość zawsze będzie równa tej podanej do funkcji.
@nme: ja bym 'logicznie' dorzucił do bufora licznik który pokazuje ile elementów znajduje się w buforze, bo podpowiem Ci, że może się jeszcze zdarzyć sytuacja w której to producent działa szybciej, i nadpisze element jeszcze nie pobrany przez konsumenta ;D
@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()

{