n.....e
n.....e
#programowanie #cpp #unix #posix #synchronizacja #semafor

Jak byście zrobili funkcje produce i consume do problemu producent-konsument, jeśli consume pobierałby jako argument wartość, którą ma pobrać z bufora. Jeśli w buforze nie byłoby tej wartości to by się zawieszał?
2
  • Najlepsze
  • Wszystkie komentarze
n.....e
n.....e
Po prostu uprościłem zadanie. Tak naprawdę to przechowuję w buforze krotki, a concume przyjmuje wzorzec krotki. Zwraca pierwszą pasującą do wzorca.
1
DanioPL
@nme: rzucić jakiś wyjątek i go obsłużyć? :D
0
n.....e
n.....e
Przyznam, że nie bardzo rozumiem jak to zrobić na wyjątkach.
0
KrzaQ2
@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.
0
r.....2
r.....2
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?
0
n.....e
n.....e
@KrzaQ2: musi być blokujące, takie wymaganie.

@ronin12: Konsument pobiera jako parametr liczbę, na którą ma czekać, aż się pojawi w buforze. Jak zrobić zwykłego producenta-konsumenta, to wiem :D
0
KrzaQ2
@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.
0
n.....e
n.....e
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
0
KrzaQ2
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.
0
Sn3jku
Sn3jku
@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
0
n.....e
n.....e
@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
0