Provided by: manpages-ro-dev_4.28.0-2_all 

NUME
pthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific - gestionarea datelor
specifice firului de execuție
SINOPSIS
#include <pthread.h>
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 în diferite fire de
execuție. Deoarece firele de execuție împart un singur spațiu de memorie, acest lucru nu poate fi
realizat cu variabile obișnuite. Datele specifice firelor de execuție reprezintă răspunsul POSIX la
această necesitate.
Fiecare fir de execuție are un bloc de memorie privat, zona de date specifică firului de execuție sau, pe
scurt, zona TSD. Această zonă este indexată cu ajutorul cheilor TSD. Zona TSD asociază valori de tip void
* cheilor TSD. Cheile TSD sunt comune tuturor firelor, dar valoarea asociată unei anumite chei TSD poate
fi diferită în fiecare fir.
Pentru a fi mai concreți, zonele TSD pot fi considerate ca fiind matrice de indicatori void *, cheile TSD
ca indici întregi în aceste matrice, iar valoarea unei chei TSD ca valoare a elementului de matrice
corespunzător în firul de apelare.
Atunci când este creat un fir, zona TSD a acestuia asociază inițial NULL cu toate cheile.
pthread_key_create alocă o nouă cheie TSD. Cheia este stocată în locația indicată de key. Există o limită
de PTHREAD_KEYS_MAX pentru numărul de chei alocate la un moment dat. Valoarea asociată inițial cheii
returnate este NULL în toate firele de execuție în curs.
Argumentul destr_function, dacă nu este NULL, specifică o funcție de distrugere asociată cu cheia. Atunci
când un fir de execuție se termină prin pthread_exit sau prin anulare, destr_function este apelată cu
argumentele valorii asociate cheii în acel fir de execuție. destr_function nu este apelată dacă valoarea
respectivă este NULL. Ordinea în care sunt apelate funcțiile de distrugere în momentul terminării firului
nu este specificată.
Înainte de apelarea funcției de distrugere, valoarea NULL este asociată cu cheia în firul curent. Cu
toate acestea, o funcție de distrugere ar putea reasocia valorile non-NULL la această cheie sau la o altă
cheie. Pentru a rezolva această problemă, dacă, după ce toți destructorii au fost apelați pentru toate
valorile non-NULL, mai există încă valori non-NULL cu destructori asociați, procesul se repetă.
Implementarea „LinuxThreads” oprește procesul după PTHREAD_DESTRUCTOR_ITERATIONS iterații, chiar dacă mai
rămân câteva valori non-NULL cu descriptori asociați. Alte implementări pot efectua bucle la nesfârșit.
pthread_key_delete anulează alocarea unei chei TSD. Nu verifică dacă există valori non-NULL asociate cu
cheia respectivă în firele de execuție în curs de execuție și nici nu apelează funcția de distrugere
asociată cu cheia.
pthread_setspecific modifică valoarea asociată cu key în firul de apelare, stocând în schimb pointer-ul
dat.
pthread_getspecific returnează valoarea asociată în prezent cu key în firul de apelare.
VALOAREA RETURNATĂ
pthread_key_create, pthread_key_delete și pthread_setspecific returnează 0 în caz de succes și un cod de
eroare diferit de zero în caz de eșec. În caz de succes, pthread_key_create stochează cheia nou alocată
în locația indicată de argumentul său key.
pthread_getspecific returnează valoarea asociată cu key în caz de succes, și NULL în caz de eroare.
ERORI-IEȘIRE
În caz de eroare, pthread_key_create returnează următorul cod de eroare:
EAGAIN Cheile PTHREAD_KEYS_MAX sunt deja alocate.
În caz de eroare, pthread_key_delete și pthread_setspecific returnează următorul cod de eroare:
EINVAL key nu este o cheie TSD validă, alocată.
pthread_getspecific returnează NULL dacă key nu este o cheie TSD validă, alocată.
CONSULTAȚI ȘI
pthread_create(3), pthread_exit(3), pthread_testcancel(3).
EXEMPLU
Următorul fragment de cod alocă o matrice de 100 de caractere specifică firului de execuție, cu
recuperare automată la ieșirea din fir:
/* Cheia pentru memoria tampon specifică firului */ static pthread_key_t buffer_key; /* O singură inițializare 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)); } /* Returnează memoria tampon specifică 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); } /* Eliberează memoria tampon specifică firului */ static void buffer_destroy(void * buf) { free(buf); }
TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu
<remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o
versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO
RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-
ro@lists.sourceforge.net.
Pagini de manual de Linux 6.9.1 16 iunie 2024 pthread_key_create(3)