Domácí úkol z vláken: filozofové
V nedávném spotu ABC
synchronizace pro mírně pokročilé jsem mimo jiné upozorňoval na domácí úkol, který se
k článku vztahoval. Jak mi později prozradil Tomáš, problém pěti filozofů
patří do kategorie cvičebnicových příkladů.
Zadání (angl. originál)
Five philosophers sit around a circular table. Each philosopher alternates between
thinking and eating rice. In front of each philosopher is a bowl of rice that is
constantly replenished by a dedicated waiter. Exactly five chopsticks are on the table,
with one chopstick between each adjacent pair of philosophers. Each philosopher must pick
up both chopsticks adjacent to his/her plate simultaneously before that philosopher can
eat.
Create a Java application that simulates this behavior. Avoid deadlock and the problem of
indefinite postponement, where one of more philosophers soon starve because philosophers
adjacent to the starving philosophers are always eating. Make sure that mutual exclusion
is enforced, so that two adjacent philosophers do not use the same chopstick at the same
time.
Postup
Abych přiznal barvu, tak musím říci, že mě ten problém zaujal a nechtěl jsem jej opustit,
než naprogramuji řešení. Moje řešení je
založeno poolu hůlek.
Pokud chce filozof jíst “požádá” stůl o hůlky, stůl pak deleguje žádost na pool. Pokud v poolu hůlky nejsou, je vlákno (filozof) zastaveno a zařazeno do fronty. V případě, že filozof vrátí hůlky, jsou čekající vlákna vzbuzena. Pokud je vlákno zároveň na začátku fronty a jeho hůlky jsou volné, pak jsou mu hůlky vráceny. Program vypisuje jednotlivé kroky do konsole.
Související články
Související epizody CZ Podcastu
- #3 · Java 6 SE, Vývoj webových aplikací
Dagi a Filemon o novinkách v Javě 6 a webových frameworcích.
- #1 · Vývojová prostředí v Javě
První díl CZ Podcastu se věnuje vývojovým prostředím pro Javu.