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