当前位置: 技术问答>linux和unix
[在线]关于APUE中的一段代码,有些迷惑,请教。
来源: 互联网 发布时间:2016-10-17
本文导语: APUE | fig12.13 代码如下: #include #include #include #include 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_i...
APUE | fig12.13 代码如下:
我的问题是,这里的互斥量在保护什么?
我的理解是,env_mutex是在保护environ的读写访问。让我疑惑的是,作者在 1 处就加锁,看不出有什么必要。
我是认为应该从 2 开始加锁。
#include
#include
#include
#include
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); /* 1. 为什么在这里就加锁,保护malloc()吗? */
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);
/* 2. 我认为应该从这里开始加锁 */
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);
}
我的问题是,这里的互斥量在保护什么?
我的理解是,env_mutex是在保护environ的读写访问。让我疑惑的是,作者在 1 处就加锁,看不出有什么必要。
我是认为应该从 2 开始加锁。
|
应该也可以吧,malloc是线程安全的