pthread_getspecific和互斥锁

时间:2012-11-14 12:56:25

标签: pthreads mutex thread-local

我想为strerror_r调用创建线程局部缓冲区并编写我自己的线程安全char * my_strerror(int),它将使用线程本地缓冲区并调用strerror_r。

在阅读R.Stevens在Unix环境中的高级编程中关于pthread_getspecific()的示例时,我觉得有点不一致 - 为什么在下面的示例中使用了互斥?

书中的例子:

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

1 个答案:

答案 0 :(得分:2)

保护environ变量需要使用互斥锁,例如putenv。锁定调用很糟糕,但最好立即放在strlen之后。