Tehnici de implementare a concurentei în analiza si proiectarea ...
Tehnici de implementare a concurentei în analiza si proiectarea ...
Tehnici de implementare a concurentei în analiza si proiectarea ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>si</strong>ncronizari conditionale, <strong>si</strong> <strong>de</strong>ci nu poate fi realizata o <strong>si</strong>ncronizare inter-activitati<br />
<strong>de</strong>pen<strong>de</strong>nta <strong>de</strong> starea monitorului (mai exact, starea obiectului reprezentat printr-un<br />
monitor) la un moment dat. "Greutatea" acestui <strong>de</strong>zavantaj poate fi masurata prin<br />
prisma unui exemplu ce va fi dat <strong>în</strong> cele ce urmeaza <strong>si</strong> care implementeaza o clasa<br />
Coada folo<strong>si</strong>nd monitorul ca mecanism <strong>de</strong> interactiune intre activitatile concurente.<br />
class monitor Coada{<br />
protected:<br />
Element listaElemente[]; //tablou cu elementele cozii<br />
int maxElem; //nr. maxim <strong>de</strong> elemente din coada<br />
int elemIntroduse; //nr. elementelor introduse <strong>în</strong> coada<br />
int elemExtrase; //nr. elementelor extrase din coada<br />
public:<br />
Coada(){…};<br />
~Coada(){…};<br />
void Adauga(Element elem) {…};<br />
Element Extrage(){…};<br />
BOOL EGoala(return elemIntroduse-elemExtrase==0;);<br />
BOOL EPlina(return elemIntroduse-elemExtrase==maxElem;)<br />
}<br />
Daca monitorul permitea mo<strong>de</strong>larea <strong>si</strong>ncronizarii conditionale atunci, <strong>în</strong><br />
momentul <strong>în</strong> care un obiect <strong>de</strong> tip Coada ar fi fost <strong>în</strong> starea plin (adica au fost<br />
introduse <strong>în</strong> coada cu maxElemente mai multe elemente <strong>de</strong>cât au fost extrase) <strong>si</strong> ar fi<br />
receptionat un mesaj Adauga(), mesajul respectiv ar fi fost pus <strong>în</strong>tr-o coada <strong>de</strong><br />
asteptare urmând ca, dupa extragerea a cel putin unui element, mesajul sa fie acceptat.<br />
Din pacate monitorul nu poseda nici o modalitate <strong>de</strong> specificare a activarii sau<br />
inactivarii unei operatii pe baza unei conditii. Pozitionarea mesajelor <strong>în</strong>tr-o coada <strong>de</strong><br />
asteptare se realizeaza strict pentru respectarea exclu<strong>de</strong>rii mutuale.<br />
Astfel, pentru a se tine cont <strong>de</strong> starea unui obiect, trebuiesc <strong>de</strong>finite <strong>în</strong> clasa<br />
Coada doua meto<strong>de</strong> care sa poata fi folo<strong>si</strong>te la inspectarea acestei stari - EGoala(),<br />
respectiv EPlina(). Cele doua meto<strong>de</strong> vor fi folo<strong>si</strong>te <strong>de</strong> catre obiectele care doresc<br />
introducerea sau extragerea <strong>de</strong> elemente dintr-un obiect <strong>de</strong> tip Coada. Acest lucru<br />
<strong>în</strong>sa implica nerespectarea principiului implementarii codului <strong>de</strong> interactiune <strong>în</strong> cadrul<br />
obiectului apelat.<br />
Un alt <strong>de</strong>zavantaj major al monitoarelor este acela ca <strong>în</strong> cazul unei utilizari<br />
neglijente ele pot conduce cu usurinta, asemanator semafoarelor, la <strong>si</strong>tuatii <strong>de</strong> impas.<br />
Aceasta problema este cunoscuta <strong>în</strong> literatura <strong>de</strong> specialitate <strong>si</strong> sub <strong>de</strong>numirea <strong>de</strong><br />
problema apelului monitoarelor <strong>în</strong>castrate (nested monitors call).<br />
33