Wpis z mikrobloga

Zaraz mnie coś trafi. Całą noc siedzę nad semaforami i nie mogę tego zrobić.

Probem: Dwóch producentów, dwóch konsumetów, bufor fifo, liczby losowe. Konsumenci identyczni (jedna funkcja), jeden producent pisze kiedy chce (pod warunkiem, że bufor nie jest pełny), drugi może pisać tylko jeżeli suma liczb w buforze spełnia pewien warunek.

Rozwiązałem bez uwzględniania warunku z sumą.

Na pewno mam semafory:

mutex(1); // broni dostępu do bufora

production(BUFFER_CAPACITY); // bo produkować można aż do przepełnienia

consumption(0); // bo na początku bufor jest pusty i nic nie można wyjąć

consumer() {

consumption.p();

mutex.p();

// żre z bufora

mutex.v();

if(bufor nie jest pełny)

production.v();

}

producer1 {

production.p();

mutex.p();

// wpycha do bufora

mutex.v();

if(bufor nie jest pusty)

consumption.v();

}

Wyjaśni mi ktoś jak zmodyfikować to rozwiązanie, żeby producer2 pisał tylko pod spełnionym warunkiem odpowiedniej sumy w buforze (damy na to, większej od 100)?

Próbowałem wiele godzin metodą prób i błędów, nie ma szans. Nie ogarniam. Ile i jakie dodatkowe semafory wprowadzić? Jaka powinna być kolejność podnoszenia i opuszczania?

UWAGA POLITYKA W SPOJLERZE:


#programowanie #wielowatkowosc #cpp #warsawshore
  • 8
@koob: Ok, dwie wiadomości, dobra i zła. Zła jest taka. że przedstawione rozwiązanie nic nie daje ponieważ zakłada, że wszyscy producenci są tacy sami i wszyscy jednocześnie mogą lub nie mogą produkować. U mnie sytuacja jest inna: jeżeli może produkować jeden z producentów to niekoniecznie może drugi, chociaż jeżeli może drugi to na pewno może też pierwszy.

Dobra jest taka, że to rozwiązanie podsunęło mi własne, zadziwiająco proste i #!$%@? brzydkie,
Pomimo iż ogólnie ja prawak, to właśnie sobie uświadomiłem, że niektóre pomysły #korwin'a to są o kant dupy potłuc. Tak jak tutaj: mamy króla programistę i państwo, w którym jedni lewacy chcą tylko żyć i żreć, a drugie #trybson'y interesuje tylko, żeby gdzieś coś wepchnąć if you know what I mean. I jedni i drudzy mają w dupie innych, starają się tylko zaspokoić własne potrzeby choćby mieli kogoś zagłodzić. Mi
@Onoki:

Na pewno w producentach ten warunek jest niepotrzebny:

if(bufor nie jest pusty) {

consumption.v();

}

Analogicznie w konsumencie.

Skoro coś przed chwilą wyprodukowaliśmy/zjedliśmy, to na pewno bufor nie jest pusty/pełny i zawsze wykonane zostanie consumption.v()/production.v().
@kemek: Uprościłem opis mojego problemu żeby nie robić zamieszania. W rzeczywistości muszę mieć co najmniej pięć elementów w buforze, więc ten warunek jest konieczny.

PYTANIE POZOSTAJE OTWARTE

Jak zrobić to dobrze?