.\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH PTHREAD_SPECIFIC 3 LinuxThreads .SH NOM pthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific \- Gestion de données spécifiques à un thread .SH SYNOPSIS \fB#include \fP \fBint pthread_key_create(pthread_key_t *\fP\fIkey\fP\fB, void (*\fP\fIdestr_function\fP\fB) (void *));\fP \fBint pthread_key_delete(pthread_key_t \fP\fIkey\fP\fB);\fP \fBint pthread_setspecific(pthread_key_t \fP\fIkey\fP\fB, const void *\fP\fIpointer\fP\fB);\fP \fBvoid * pthread_getspecific(pthread_key_t \fP\fIkey\fP\fB);\fP .SH 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 \fBvoid *\fP 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 \fBvoid *\fP, 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. \fBpthread_key_create\fP() alloue une nouvelle clé TSD. Cette clé est enregistrée à l'emplacement pointée par \fIclé\fP. Il ne peut y avoir plus de \fBPTHREAD_KEYS_MAX\fP 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 \fIdestr_function\fP, si différent de NULL, spécifie une fonction de destruction associée à une clé. Quand le thread se termine par \fBpthread_exit\fP() ou par une annulation, \fIdestr_function\fP est appelée avec en argument les valeurs associées aux clés de ce thread. La fonction \fIdestr_function\fP 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 LinuxThreads interrompt cette procédure après \fBPTHREAD_DESTRUCTOR_ITERATIONS\fP 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. \fBpthread_key_delete\fP() 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é. \fBpthread_setspecific\fP() change la valeur associée avec \fIclé\fP dans le thread appelant, sauve le paramètre \fIpointer\fP à sa place. \fBpthread_getspecific\fP() renvoie la valeur actuellement associée avec \fIclé\fP dans le thread appelant. .SH "VALEUR RENVOYÉE" \fBpthread_key_create\fP(), \fBpthread_key_delete\fP() et \fBpthread_setspecific\fP() renvoient 0 en cas de succès et un code d'erreur non nul en cas d'échec. En cas de succès, \fBpthread_key_create\fP() enregistre la clé récemment créée à l'emplacement pointé par son argument \fIclé\fP. \fBpthread_getspecific\fP() renvoie la valeur associée à \fIclé\fP en cas de succès et NULL en cas d'erreur. .SH ERREURS \fBpthread_key_create\fP() renvoie le code d'erreur suivant\ : .RS .TP \fBEAGAIN\fP \fBPTHREAD_KEYS_MAX\fP clés sont déjà allouées. .RE \fBpthread_key_delete\fP() et \fBpthread_setspecific\fP() renvoient le code d'erreur suivant\ : .RS .TP \fBEINVAL\fP \fIclé\fP n'est pas une clé TSD allouée valable. .RE \fBpthread_getspecific\fP() renvoie NULL si \fIclé\fP n'est pas une clef TSD allouée valable. .SH AUTEUR Xavier Leroy .SH "VOIR AUSSI" \fBpthread_create\fP(3), \fBpthread_exit\fP(3), \fBpthread_testcancel\fP(3). .SH 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. .RS .nf .sp \fB/* Clé pour le tampon spécifique au thread */ static pthread_key_t buffer_key;\fP \fB/* Initialisation unique de la clé */ static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;\fP \fB/* 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)); }\fP \fB/* Renvoie le tampon spécifique au thread */ char * get_buffer(void) { return (char *) pthread_getspecific(buffer_key); }\fP \fB/* Alloue la clé */ static void buffer_key_alloc() { pthread_key_create(&buffer_key, buffer_destroy); }\fP \fB/* Libère le tampon spécifique au thread */ static void buffer_destroy(void * buf) { free(buf); }\fP .LP .RE .fi .SH TRADUCTION Cette page de manuel a été traduite par Thierry Vignaud en 2000 et révisée par Alain Portal en 2006. La version présente dans Debian est maintenue par les membres de la liste . Veuillez signaler toute erreur de traduction par un rapport de bogue sur le paquet manpages\-fr\-extra.