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.

Variabile <strong>de</strong> conditie. Variabilele <strong>de</strong> conditie reprezinta o exten<strong>si</strong>e a<br />

conceptului <strong>de</strong> monitor <strong>si</strong> ele au fost introduse <strong>de</strong> C. A. R. Hoare <strong>în</strong> 1974 [HOA74].<br />

Prin aceasta exten<strong>si</strong>e o activitate intrata <strong>în</strong>tr-un monitor poate fi blocata <strong>în</strong> interiorul<br />

acestuia cu ajutorul unei variabile <strong>de</strong> conditie. Cât timp aceasta activitate este blocata<br />

se poate da curs unui solicitari <strong>de</strong> apel <strong>de</strong> operatie care se afla <strong>în</strong> coada <strong>de</strong> asteptare a<br />

monitorului. O variabila <strong>de</strong> conditie are doua operatii, wait <strong>si</strong> <strong>si</strong>gnal, care pot<br />

<strong>de</strong>termina blocarea sau <strong>de</strong>blocarea unei activitati. Problema care apare este data <strong>de</strong><br />

alegerea algortimului <strong>de</strong> <strong>de</strong>cizie <strong>în</strong> cazul <strong>de</strong>blocarii a doua sau mai multe activitati <strong>în</strong><br />

acela<strong>si</strong> timp (<strong>de</strong>oarece, asa cum am vazut, <strong>în</strong>tr-un monitor poate fi activa cel mult o<br />

activitate). De asemenea, trebuie stabilit daca activitatea care a generat <strong>de</strong>blocarea î<strong>si</strong><br />

va continua executia pâna la ie<strong>si</strong>rea din monitor dupa care va fi reactivata una dintre<br />

operatiile <strong>de</strong>blocate sau, dimpotriva, activitatea curenta va fi suspendata pâna când<br />

vor para<strong>si</strong> monitorul activitatile <strong>de</strong>blocate <strong>de</strong> acesta.<br />

Câstigul evi<strong>de</strong>nt al extin<strong>de</strong>rii monitorului cu variabile <strong>de</strong> conditie este acela ca<br />

pot fi mo<strong>de</strong>late <strong>si</strong>ncronizari conditionale <strong>în</strong>tre activitati concurente. Prin urmare pot fi<br />

mo<strong>de</strong>late interactiuni concurente <strong>în</strong> functie <strong>de</strong> starea monitorului la un moment dat.<br />

class monitor Coada{<br />

. . .<br />

//<strong>de</strong>clararea tuturor proprietati <strong>si</strong> a operatiilor este i<strong>de</strong>ntica<br />

//cu cea din exemplul <strong>de</strong> <strong>implementare</strong> secventiala<br />

. . .<br />

//<strong>de</strong>clararea <strong>de</strong> proprietati specifice <strong>si</strong>ncronizarii<br />

//cu variabile <strong>de</strong> conditie<br />

private:<br />

condition Gol;//variabila <strong>de</strong> conditie pentru coada goala<br />

condition Plin;//variabila <strong>de</strong> conditie pentru coada plina<br />

}<br />

void Coada::Adauga(Element elem){<br />

if(elemIntroduse-elemExtrase==maxElem)<br />

Plin.wait();<br />

elemIntroduse++;<br />

listaElemente[elemIntroduse % maxElem - 1]=elem<br />

Gol.<strong>si</strong>gnal();<br />

}<br />

Element Coada::Extrage(){<br />

if(elemIntroduse-elemExtrase==0)<br />

Gol.wait();<br />

elemExtrase++;<br />

Element elemTmp=listaElemente[elemExtrase % maxElem - 1];<br />

Plin.<strong>si</strong>gnal();<br />

return elemTmp;<br />

}<br />

Implementarea unei cozi cu numar limitat <strong>de</strong> elemente folo<strong>si</strong>nd variabilele <strong>de</strong><br />

conditie sugereaza o asemanare dintre aceasta abordare <strong>de</strong> mo<strong>de</strong>lare a interactiunilor<br />

concurente <strong>si</strong> abordarea folo<strong>si</strong>nd semafoare.<br />

34

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

Saved successfully!

Ooh no, something went wrong!