[so] [Tema3] Utilizarea Thread Specific Data

Razvan Deaconescu razvand at cs.pub.ro
Tue Dec 4 21:28:26 EET 2007


On Sat, 2007-12-01 at 20:30 +0200, Stefan Bucur wrote:
> In enuntul temei de casa 3, legat de implementarea pe Linux, se precizeaza:
> 
> "Pentru a testa utilizarea corecta a monitorului mentineti un index in
> Thread Specific Data care indica pentru fiecare fir de executie daca
> se afla sau nu in interiorul monitorului. Nu e necesar sa alocati
> memorie, puteti folosi doar valoarea pointerului din indexul TSD.
> Atentie insa nu folositi NULL pentru ca NULL este returnat de
> pthread_getspecific in caz de eroare. Indexul TSD este initializat
> implicit la NULL deci va trebui sa folositi functia de initializare a
> bibliotecii pentru initializarea lui cu o valoare utila."

Greseala de exprimare. Dupa cum ai spus si tu mai jos,
pthread_getspecific intoarce NULL in cazul in care nu exista o valoare
asociata cheii[1]. Din pacate, in paginile vechi de manual pentru
pthread_getspecific se spunea "pthread_getspecific returns the value
associated with key  on  success, and NULL on error".

> Problema este ca functia de initializare a bibliotecii, din ce a
> reiesit dupa o serie de cautari pe Internet, este apelata o singura
> data, iar in momentul initializarii eu nu stiu cate monitoare vor fi
> create de catre aplicatia care utilizeaza biblioteca mea (ca sa stiu
> cate chei initializez). Presupunand ca biblioteca va trebui sa permita
> crearea si utilizarea simultana a oricator monitoare, nu imi dau seama
> ce rost are acea functie de initializare globala.

Se presupune un singur monitor utilizat la un moment dat. In acest
moment, specificatiile temei reprezinta un neajuns din punctul de vedere
exprimat de tine.

> In acelasi timp, standardul POSIX precizeaza clar faptul ca
> pthread_getspecific _NU_ intoarce cod de eroare: No errors are
> returned from pthread_getspecific() [ sursa:
> http://www.opengroup.org/onlinepubs/000095399/functions/pthread_getspecific.html
> ].

Curse ye old man pages :-)

> In aceste conditii, solutia mea este crearea on-the-fly a cheilor
> pentru TSD, la crearea fiecarui monitor, stocate in structura Monitor
> (cate una pentru fiecare monitor in parte), si neinitializate. Astfel,
> NULL va semnifica faptul ca thread-ul curent nu detine monitorul, in
> timp ce o valoare nenula este setata atunci cand thread-ul a primit
> monitorul.

Ca sa nu te lovesti de neajunsul specificatiilor temei poti sa creezi o
_singura_ cheie (pthread_key_create) in functia de initializare a
bibliotecii.

> Daca rationamentul meu este gresit, va rog sa ma corectati.

Este OK cum ai gandit.

Razvan



More information about the so mailing list