1

strerror_r 呼び出し用のスレッド ローカル バッファーを作成し、スレッド ローカル バッファーを使用して strerror_r を呼び出す独自のスレッド セーフな char * my_strerror(int) を作成したいと考えています。

R.Stevens による Unix 環境の高度なプログラミングの pthread_getspecific() に関する例を読んでいるときに矛盾を感じます -以下の例でミューテックスが使用されているのはなぜですか?

本からの例:

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

static pthread_key_t キー;
static pthread_once_t init_done = PTHREAD_ONCE_INIT;
pthread_mutex_t env_mutex = PTHREAD_MUTEX_INITIALIZER;

extern char **environ;

静的ボイド
thread_init(void)
{
    pthread_key_create(&key, free);
}

文字 *
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);
            リターン (ヌル);
        }
        pthread_setspecific(キー、envbuf);
    }
    len = strlen(名前);
    for (i = 0; 環境[i] != NULL; i++) {
        if ((strncmp(name, 環境[i], len) == 0) &&
          (environ[i][len] == '=')) {
            strcpy(envbuf, &environ[i][len+1]);
            pthread_mutex_unlock(&env_mutex);
            戻ります (envbuf);
        }
    }
    pthread_mutex_unlock(&env_mutex);
    リターン (ヌル);
}

4

1 に答える 1

3

ミューテックスはenviron、たとえば から変数を保護するために必要ですputenv。ロック呼び出しの配置が不適切ですが、strlen.

于 2012-11-17T09:16:27.287 に答える