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.

sus (adica semafoarele marcheaza sectiuni critice caracteristice unor proprietati<br />

private ale clasei). Semafoarele pozGoale <strong>si</strong> pozPline coordoneaza adaugarea,<br />

respectiv extragerea <strong>de</strong> elemente din coada (<strong>în</strong> functie <strong>de</strong> starea <strong>în</strong> care se afla<br />

aceasta), iar secCritica1 <strong>si</strong> secCritica2 au rolul <strong>de</strong> a evita efectuarea <strong>de</strong> modificari<br />

concurente asupra proprietatilor private elemIntroduse, respectiv elemExtrase precum<br />

<strong>si</strong> realizarea <strong>în</strong> paralel a introducerii <strong>si</strong> extragerii efective <strong>de</strong> elemente. Prin urmare<br />

exemplul surprin<strong>de</strong> atât <strong>implementare</strong>a exclu<strong>de</strong>rii mutuale cât <strong>si</strong> a <strong>si</strong>ncronizarii<br />

conditionale.<br />

Coada::Coada():<br />

pozGoale(100),<br />

pozPline(0),<br />

secCritica1(1),<br />

secCritica2(1)<br />

{<br />

//pentru <strong>si</strong>mplitate nu am <strong>de</strong>finit constructor explicit<br />

maxElem=100;<br />

listaElemente=new [maxElem] Element;<br />

elemIntroduse=elemExtrase=0;<br />

}<br />

Coada::~Coada(){<br />

... //<strong>de</strong>structor i<strong>de</strong>ntic cu cel din ver<strong>si</strong>unea secventiala<br />

}<br />

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

pozGoale.P();<br />

secCritica1.P();<br />

elemIntroduse++;<br />

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

secCritica1.V();<br />

pozPline.V();<br />

}<br />

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

pozPline.P();<br />

secCritica2.P();<br />

elemExtrase++;<br />

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

secCritica2.V();<br />

pozGoale.V();<br />

return elemTmp;<br />

}<br />

Asa cum se poate observa din <strong>implementare</strong>a <strong>de</strong> mai sus, operatiile asupra<br />

semafoarelor (care <strong>de</strong>limiteaza sectiunea critica) sunt efectuate <strong>în</strong> interiorul corpului<br />

operatiilor clasei. Prin urmare, codul care <strong>de</strong>scrie interactiunea concurenta nu este<br />

separat <strong>de</strong> codul care implementeaza functionalitatea operatiilor, lucru care poate<br />

<strong>de</strong>termina aparitia asa-numitelor anomalii <strong>de</strong> mostenire <strong>în</strong> cazul reutilizarii.<br />

La rândul lor, mecanismele mutex (<strong>de</strong>rivat pe baza termenului <strong>de</strong> exclu<strong>de</strong>re<br />

mutuala) <strong>si</strong> lock sunt cazuri particulare <strong>de</strong> semafoare care permit unei <strong>si</strong>ngure<br />

activitati sa intre <strong>în</strong> sectiunea critica la un moment dat. Concluziile trase relativ la<br />

29

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

Saved successfully!

Ooh no, something went wrong!