Man page - pthread_key_create(3)

Packages contains this manual

Available languages:

en fr ja ro

Manual

pthread_key_create

NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
VOIR AUSSI
EXEMPLE
TRADUCTION

NOM

pthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific - Gestion de données spécifiques à un thread

SYNOPSIS

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

DESCRIPTION

Les programmes ont souvent besoin de variables globales ou statiques ayant diffĂ©rentes valeurs dans des threads diffĂ©rents. Comme les threads partagent le mĂȘme espace mĂ©moire, cet objectif ne peut ĂȘtre rĂ©alisĂ© avec les variables usuelles. Les donnĂ©es spĂ©cifiques Ă  un thread POSIX sont la rĂ©ponse Ă  ce problĂšme.

Chaque thread possÚde un segment mémoire privé, le TSD (Thread-Specific Data : Données Spécifiques au Thread). Cette zone mémoire est indexée par des clés TSD. La zone TSD associe des valeurs du type void * aux clés TSD. Ces clés sont communes à tous les threads, mais la valeur associée à une clé donnée est différente dans chaque thread.

Pour concrĂ©tiser ce formalisme, les zones TSD peuvent ĂȘtre vues comme des tableaux de pointeurs void * , les clĂ©s TSD comme des indices entiers pour ces tableaux, et les valeurs des clĂ©s TSD comme les valeurs des entrĂ©es correspondantes dans le tableau du thread appelant.

Quand un thread est créé, sa zone TSD associe initialement NULL à toutes les clés.

pthread_key_create () alloue une nouvelle clĂ© TSD. Cette clĂ© est enregistrĂ©e Ă  l’emplacement pointĂ©e par clĂ© . Il ne peut y avoir plus de PTHREAD_KEYS_MAX clĂ©s allouĂ©es Ă  un instant donnĂ©. La valeur initialement associĂ©e avec la clĂ© renvoyĂ©e est NULL dans tous les threads en cours d’exĂ©cution.

Le paramĂštre destr_function , si diffĂ©rent de NULL, spĂ©cifie une fonction de destruction associĂ©e Ă  une clĂ©. Quand le thread se termine par pthread_exit () ou par une annulation, destr_function est appelĂ©e avec en argument les valeurs associĂ©es aux clĂ©s de ce thread. La fonction destr_function n’est pas appelĂ©e si cette valeur est NULL. L’ordre dans lequel les fonctions de destruction sont appelĂ©es lors de la fin du thread n’est pas spĂ©cifiĂ©e.

Avant que la fonction de destruction soit appelĂ©e, la valeur NULL est associĂ©e Ă  la clĂ© dans le thread courant. Une fonction de destruction peut cependant rĂ©associer une valeur diffĂ©rente de NULL Ă  cette clĂ© ou une autre clĂ©. Pour gĂ©rer ce cas de figure, si aprĂšs l’appel de tous les destructeurs pour les valeurs diffĂ©rentes de NULL, il existe toujours des valeurs diffĂ©rentes de NULL avec des destructeurs associĂ©s, alors la procĂ©dure est rĂ©pĂ©tĂ©e. L’implĂ©mentation de glibc interrompt cette procĂ©dure aprĂšs PTHREAD_DESTRUCTOR_ITERATIONS itĂ©rations, mĂȘme s’il reste des valeurs diffĂ©rentes de NULL associĂ©es Ă  des descripteurs. Les autres implĂ©mentations peuvent boucler sans fin.

pthread_key_delete () dĂ©salloue une clĂ© TSD. Elle ne vĂ©rifie pas si des valeurs diffĂ©rentes de NULL sont associĂ©es avec cette clĂ© dans les threads en cours d’exĂ©cution, ni n’appelle la fonction de destruction associĂ©e avec cette clĂ©.

pthread_setspecific () change la valeur associée avec clé dans le thread appelant, sauve le paramÚtre pointer à sa place.

pthread_getspecific () renvoie la valeur actuellement associée avec clé dans le thread appelant.

VALEUR RENVOYÉE

pthread_key_create (), pthread_key_delete () et pthread_setspecific () renvoient 0 en cas de succĂšs et un code d’erreur non nul en cas d’échec. En cas de succĂšs, pthread_key_create () enregistre la clĂ© rĂ©cemment créée Ă  l’emplacement pointĂ© par son argument clĂ© .

pthread_getspecific () renvoie la valeur associĂ©e Ă  clĂ© en cas de succĂšs et NULL en cas d’erreur.

ERREURS

pthread_key_create () renvoie le code d’erreur suivant :

EAGAIN

PTHREAD_KEYS_MAX clés sont déjà allouées.

pthread_key_delete () et pthread_setspecific () renvoient le code d’erreur suivant :

EINVAL

clĂ© n’est pas une clĂ© TSD allouĂ©e valable.

pthread_getspecific () renvoie NULL si clĂ© n’est pas une clef TSD allouĂ©e valable.

VOIR AUSSI

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

EXEMPLE

L’extrait de code suivant alloue dans un thread un tableau de 100 caractĂšres, avec libĂ©ration de la mĂ©moire automatiquement Ă  la fin de l’exĂ©cution du thread.

/* Clé pour le tampon spécifique au thread */ static pthread_key_t buffer_key; /* Initialisation unique de la clé */ static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT; * Alloue le tampon spécifique au thread */ void buffer_alloc(void) { pthread_once(&buffer_key_once, buffer_key_alloc); pthread_setspecific(buffer_key, malloc(100)); } * Renvoie le tampon spécifique au thread */ char * get_buffer(void) { return (char *) pthread_getspecific(buffer_key); } /* Alloue la clé */ static void buffer_key_alloc() { pthread_key_create(&buffer_key, buffer_destroy); } /* LibÚre le tampon spécifique au thread */ static void buffer_destroy(void * buf) { free(buf); }

TRADUCTION

La traduction française de cette page de manuel a été créée par Gérard Delafond <gerard@delafond.org>, Christophe Blaess <ccb@club-internet.fr>, Thierry Vignaud <tvignaud@mandriva.com>, Alain Portal <aportal@univ-montp2.fr>, Denis Barbier <barbier@debian.org>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Thomas Blein <tblein@tblein.eu> et David Prévot <david@tilapin.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .