pthread_key_create(3) Library Functions Manual pthread_key_create(3) NUME pthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific - gestionarea datelor specifice firului de execuie REZUMAT #include int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *)); int pthread_key_delete(pthread_key_t key); int pthread_setspecific(pthread_key_t key, const void *pointer); void * pthread_getspecific(pthread_key_t key); DESCRIERE Programele au adesea nevoie de variabile globale sau statice care au valori diferite in diferite fire de execuie. Deoarece firele de execuie impart un singur spaiu de memorie, acest lucru nu poate fi realizat cu variabile obinuite. Datele specifice firelor de execuie reprezinta raspunsul POSIX la aceasta necesitate. Fiecare fir de execuie are un bloc de memorie privat, zona de date specifica firului de execuie sau, pe scurt, zona TSD. Aceasta zona este indexata cu ajutorul cheilor TSD. Zona TSD asociaza valori de tip void * cheilor TSD. Cheile TSD sunt comune tuturor firelor, dar valoarea asociata unei anumite chei TSD poate fi diferita in fiecare fir. Pentru a fi mai concrei, zonele TSD pot fi considerate ca fiind matrice de indicatori void *, cheile TSD ca indici intregi in aceste matrice, iar valoarea unei chei TSD ca valoare a elementului de matrice corespunzator in firul de apelare. Atunci cand este creat un fir, zona TSD a acestuia asociaza iniial NULL cu toate cheile. pthread_key_create aloca o noua cheie TSD. Cheia este stocata in locaia indicata de key. Exista o limita de PTHREAD_KEYS_MAX pentru numarul de chei alocate la un moment dat. Valoarea asociata iniial cheii returnate este NULL in toate firele de execuie in curs. Argumentul destr_function, daca nu este NULL, specifica o funcie de distrugere asociata cu cheia. Atunci cand un fir de execuie se termina prin pthread_exit sau prin anulare, destr_function este apelata cu argumentele valorii asociate cheii in acel fir de execuie. destr_function nu este apelata daca valoarea respectiva este NULL. Ordinea in care sunt apelate funciile de distrugere in momentul terminarii firului nu este specificata. Inainte de apelarea funciei de distrugere, valoarea NULL este asociata cu cheia in firul curent. Cu toate acestea, o funcie de distrugere ar putea reasocia valorile non-NULL la aceasta cheie sau la o alta cheie. Pentru a rezolva aceasta problema, daca, dupa ce toi destructorii au fost apelai pentru toate valorile non-NULL, mai exista inca valori non-NULL cu destructori asociai, procesul se repeta. Implementarea ,,LinuxThreads" oprete procesul dupa PTHREAD_DESTRUCTOR_ITERATIONS iteraii, chiar daca mai raman cateva valori non-NULL cu descriptori asociai. Alte implementari pot efectua bucle la nesfarit. pthread_key_delete anuleaza alocarea unei chei TSD. Nu verifica daca exista valori non-NULL asociate cu cheia respectiva in firele de execuie in curs de execuie i nici nu apeleaza funcia de distrugere asociata cu cheia. pthread_setspecific modifica valoarea asociata cu key in firul de apelare, stocand in schimb pointer-ul dat. pthread_getspecific returneaza valoarea asociata in prezent cu key in firul de apelare. VALOAREA RETURNATA pthread_key_create, pthread_key_delete i pthread_setspecific returneaza 0 in caz de succes i un cod de eroare diferit de zero in caz de eec. In caz de succes, pthread_key_create stocheaza cheia nou alocata in locaia indicata de argumentul sau key. pthread_getspecific returneaza valoarea asociata cu key in caz de succes, i NULL in caz de eroare. ERORI-IEIRE In caz de eroare, pthread_key_create returneaza urmatorul cod de eroare: EAGAIN Cheile PTHREAD_KEYS_MAX sunt deja alocate. In caz de eroare, pthread_key_delete i pthread_setspecific returneaza urmatorul cod de eroare: EINVAL key nu este o cheie TSD valida, alocata. pthread_getspecific returneaza NULL daca key nu este o cheie TSD valida, alocata. CONSULTAI I pthread_create(3), pthread_exit(3), pthread_testcancel(3). EXEMPLU Urmatorul fragment de cod aloca o matrice de 100 de caractere specifica firului de execuie, cu recuperare automata la ieirea din fir: /* Cheia pentru memoria tampon specifica firului */ static pthread_key_t buffer_key; /* O singura iniializare a cheii */ static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT; /* Alocarea memoriei tampon specifice firului */ void buffer_alloc(void) { pthread_once(&buffer_key_once, buffer_key_alloc); pthread_setspecific(buffer_key, malloc(100)); } /* Returneaza memoria tampon specifica firului */ char * get_buffer(void) { return (char *) pthread_getspecific(buffer_key); } /* Alocarea cheii */ static void buffer_key_alloc() { pthread_key_create(&buffer_key, buffer_destroy); } /* Elibereaza memoria tampon specifica firului */ static void buffer_destroy(void * buf) { free(buf); } TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.06 24 noiembrie 2023 pthread_key_create(3)