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); }
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
réécrire comme réponse s'il vous plaît. –