Monitor (návrhový vzor)

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

Monitor je návrhový vzor pro situaci, kdy více různých vláken (klientů) využívá souběžně metody jednoho objektu, přičemž tyto metody mění stav daného objektu. Je tedy třeba zajistit, aby v jednu chvíli objekt využívalo maximálně jedno vlákno a vnitřní stav objektu tak zůstával konzistentní a zároveň aby, pokud se jedno vlákno využívající objekt zablokuje (např. při čekání na jiný zdroj), bylo možné objekt uvolnit pro ostatní vlákna (klienty) a vrátit se k vykonávání metody původním vláknem, až když je to možné.

Pro tuto situaci by mohl být použit i návrhový vzor Active Object. Ten však zahrnuje další funkcionalitu navíc (jako např. +more řazení spouštění metod), která nemusí být vždy využita (a zbytečně by tak zvyšovala komplikovanost návrhu i implementace). Na rozdíl od Active Objectu jsou také metody monitoru vykonávány přímo v rámci klientského vlákna.

Základní princip fungování Monitoru je následující: monitor obsahuje zámek (monitor lock), který si lze představit jako booleanovskou proměnnou. Při spuštění metody je zámek uzamčen - tato operace musí být tzv. +more atomická, což je zajišťováno operačním systémem. Dokud je zámek uzamčen, žádná další metoda nesmí být spuštěna. Zámek je pak uvolněn po skončení metody, nebo pokud metoda z nějakého důvodu nemůže pokračovat v běhu - „zablokuje“ se. V druhém případě čekající vlákno poté, co stav blokující jeho další běh pomine, upozorní Monitor, který zajistí bezpečný přechod zpět k vykonávání operací daného vlákna.

Funkci monitoru si lze představit na situaci v rychlém občerstvení, kde je pokladna, u které může být v jednu chvíli právě jeden zákazník. Pokud příprava jídla pro zákazníka trvá déle, zákazník ustoupí stranou a čeká, zatímco jsou obsluhováni další klienti.

Literatura

Douglas C. Schmidt, Michael Stal, Hans Rohnert, Frank Buschmann "Pattern-Oriented Software Architecture, Volume 2, Patterns for Concurrent and Networked Objects", Wiley, 2000

Kategorie:Návrhové vzory

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top