pthread_key_create(3) Library Functions Manual pthread_key_create(3)

pthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific - gestionarea datelor specifice firului de execuție

#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);

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.

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.

În caz de eroare, pthread_key_create returnează următorul cod de eroare:

Cheile PTHREAD_KEYS_MAX sunt deja alocate.

În caz de eroare, pthread_key_delete și pthread_setspecific returnează următorul cod de eroare:

key nu este o cheie TSD validă, alocată.

pthread_getspecific returnează NULL dacă key nu este o cheie TSD validă, alocată.

pthread_create(3), pthread_exit(3), pthread_testcancel(3).

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); }

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.

19 mai 2024 Pagini de manual de Linux 6.8