我遇到线程问题。
我正在定义一个全局变量,一个我初始化为NULL的char *和一个互斥锁。
pthread_mutex_t mutex;
char *minURLTime;
minURLTime = NULL;
然后我初始化我的互斥锁:
pthread_mutex_init(&mutex, NULL);
然后我创建一个新线程:
void *status;
pthread_t t;
pthread_create(&t, NULL, executeThread, (void *) &val);
pthread_join(t, &status);
在该函数中,我使用strdup为minURLTime分配空间并从链接复制字符串:
pthread_mutex_lock(&mutex);
minURLTime = strdup(link);
pthread_mutex_unlock(&mutex);
当我使用堆(通过strdup,它调用malloc)时,我不明白为什么minURLTime在退出线程之前不是NULL,但它是NULL。
pthread_exit(NULL);
一旦调用pthread_exit,虽然minURLTime是通过strdup(调用malloc)分配的全局变量,但它看起来是NULL。我不明白,有人可以解释一下吗?
非常感谢,
编辑:
更多细节。
来自main():
void *status;
pthread_t t;
pthread_create(&t, NULL, executeThread, (void *) &val);
pthread_join(t, &status);
ExecuteThread功能:
void *
executeThread( void *val )
{
executeRequest(*((int *) val));
if (minURLTime != NULL) {
pthread_mutex_lock(&mutex);
fprintf(stderr, "\nURL AFTER THREAD ( BEFORE EXIT ): %s\n", minURLTime); // Not executed
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
fprintf未执行(在返回pthread_exit之前)。
executeRequest功能:
void
executeRequest( int val )
{
/* some code */
pthread_mutex_lock(&mutex);
minURLTime = strdup(link);
pthread_mutex_unlock(&mutex);
if (minURLTime != NULL) {
pthread_mutex_lock(&mutex);
fprintf(stderr, "\nURL: %s\n", minURLTime); // This one DOES print
pthread_mutex_unlock(&mutex);
}
}
这可能会有所帮助。在线程退出之前,它在executeRequest内打印,但不在executeThread内打印。
Jary
答案 0 :(得分:0)
你没有在主线程中等待新线程完成,所以你在线程开始设置其他东西之前就看到了null。此外,由于您没有使用锁保护变量,或者将其声明为volatile,编译器甚至可能已经优化注意到线程已更改它。
答案 1 :(得分:0)
我很抱歉,我意识到问题是什么,在executeRequest里面有些东西弄乱了那些变量,我真的不知道怎么会覆盖那个部分内存,但它是固定的。谢谢你,抱歉!