2012-11-14 4 views
0

Je souhaite créer un tampon thread-local pour l'appel strerror_r et écrire mon propre caractère * my_strerror (int) qui utilise thread buffer local et appelle strerror_r.pthread_getspecific et mutex lock

Lors de la lecture de l'exemple concernant pthread_getspecific() dans Advanced Programming in Unix Environment de R.Stevens, je me sens discordant - pourquoi mutex est utilisé dans l'exemple ci-dessous?

Exemple de livre:

 
#include <limits.h> 
#include <string.h> 
#include <pthread.h> 
#include <stdlib.h> 

static pthread_key_t key; 
static pthread_once_t init_done = PTHREAD_ONCE_INIT; 
pthread_mutex_t env_mutex = PTHREAD_MUTEX_INITIALIZER; 

extern char **environ; 

static void 
thread_init(void) 
{ 
    pthread_key_create(&key, free); 
} 

char * 
getenv(const char *name) 
{ 
    int  i, len; 
    char *envbuf; 

    pthread_once(&init_done, thread_init); 
    pthread_mutex_lock(&env_mutex); 
    envbuf = (char *)pthread_getspecific(key); 
    if (envbuf == NULL) { 
     envbuf = malloc(ARG_MAX); 
     if (envbuf == NULL) { 
      pthread_mutex_unlock(&env_mutex); 
      return(NULL); 
     } 
     pthread_setspecific(key, envbuf); 
    } 
    len = strlen(name); 
    for (i = 0; environ[i] != NULL; i++) { 
     if ((strncmp(name, environ[i], len) == 0) && 
      (environ[i][len] == '=')) { 
      strcpy(envbuf, &environ[i][len+1]); 
      pthread_mutex_unlock(&env_mutex); 
      return(envbuf); 
     } 
    } 
    pthread_mutex_unlock(&env_mutex); 
    return(NULL); 
} 

+2

Pour la protection de la variable 'environ', à partir de choses comme' putenv'. L'appel de verrouillage est mal placé, cependant, il vaut mieux être immédiatement après le 'strlen'. – chill

+0

réécrire comme réponse s'il vous plaît. –

Répondre

2

Le mutex est nécessaire pour la protection de la variable environ, par exemple, de putenv. L'appel de verrouillage est mal placé, cependant, il est préférable d'être immédiatement après le strlen.

Questions connexes