我想为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); }
答案 0 :(得分:2)
保护environ
变量需要使用互斥锁,例如putenv
。锁定调用很糟糕,但最好立即放在strlen
之后。