[so] De ce TLS ? - continuare:)

Cibu Cristian so@atlantis.cs.pub.ro
Wed, 26 Nov 2003 19:19:41 +0200


pe mine m-a ametit putin chestia cu destroy.

este evident ca trebuie sa existe un destroy dur care sa curete tot fara sa
faca nici o verificare.

acum, din cate am inteles, trebuie sa avem un destroy care curata doar daca
nu are nimeni treaba cu monitorul.
cineva are treaba cu monitorul daca se afla in vre-o coada sau daca este
activ. Dar cum destroy-ul se da dintr-un thread care care se presupune ca nu
are nici o legatura cu threadurile care folosesc monitorul este destul de
complicat modul in care se determina daca monitorul este sau nu folosit.

de exemplu:

in destroy ma apuc sa verific daca este cineva blocat la o conditie. pp ca
nu este, dar imediat ce fac verificare vine un thread care se blocheaza
exact la variabila aia conditie. neplacut. trebuie deci sa impiedicam
accesul la monitor in timp ce incerc sa distrug monitorul. singurul mod in
care vad facandu-se asta (doar cu resursele monitorului) este ca threadul
care face destroy sa fie el insusi activ in monitor (adica sa fi dat in
prealabil un enter()).

si de aici contradictia: distrug monitorul numai cand nimeni nu foloseste
monitorul, dar pentru ca sa vad ca monitorul este liber tocmai cel care
distruge trebuie sa fie in monitor. (presupun ca se face o exceptie :) ).

Eu sincer inclin spre existenta unei singure functii destroy (cea care
omoara tot si abia apoi intreaba), dar pe care o apelez cu grija dupa ce
toate threadurile nu mai au nevoie de monitor. prefer deci sa fie de datoria
aplicatiei care foloseste monitorul sa se asigure de corectitudinea
folosirii lui destroy.

zeii ce zic?