Cvičení 4
Témata cvičení
- Problém kuřáků cigaret
Průběh cvičení
- Povídali jsme si o problému kuřáků cigaret.
- Dle domluvy přidávám informace k agentovi. Agent modeluje OS, tedy jeho kód nesmí být nijak závislý na kuřácích, kteří modelují aplikace. Kód agenta by měl vypadat zhruba takto (samozřejmě dle použitého jazyka).
 Vašim úkolem je tedy za použití obdobného agenta (OS) ve Vámi vybraném jazyce vyřešit problem kuřáků cigaret jen v “uživatelském prostoru” kuřáků.// sdílená paměť využívaná agentem, semafory jsou implementovány ručně pomocí atomics // (semafory s takovýmto rozhraním nejsou v balíčku sync) var ( agentSem = NewSemaphore(1) // agent může hned začít, poté čeká na oznámení o spotřebování zdrojů tobaccoSem = NewSemaphore(0) paperSem = NewSemaphore(0) matchesSem = NewSemaphore(0) ) // Agent pokládá dvě náhodně zvolené ingredience na stůl func Agent() { for { agentSem.Wait() // čeká na spotřebování ingrediencí kuřáky (někdo mu to musí oznámit) // vybere dvě a položí na stůl rand.Seed(time.Now().UnixNano()) choice := rand.Intn(3) switch choice { case 0: fmt.Println("Agent places tobacco and paper") tobaccoSem.Signal() paperSem.Signal() case 1: fmt.Println("Agent places tobacco and matches") tobaccoSem.Signal() matchesSem.Signal() case 2: fmt.Println("Agent places paper and matches") paperSem.Signal() matchesSem.Signal() } } }
- Podívali jsme se na C11 atomics.
Úkoly
- Pracujte na druhém zápočtovém úkolu (kuřáci cigaret řešení vlastními semafory).
- Implementujte řešení problémů z přednášky:
- Producenti a konzumenti
- Čtenáři a písaři
- Večeřící filozofové
 
- Podívejte se do The Little Book of Semaphores na další zajímavé problémy.