18.04.2013 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!