[so] [Tema3] Utilizarea Thread Specific Data

Stefan Bucur stefan.bucur at gmail.com
Sat Dec 1 20:30:22 EET 2007


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

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.

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

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.

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

Multumesc!

Stefan Bucur
grupa 341CA


More information about the so mailing list