线程问题:存储在堆中的值

时间:2010-10-16 00:48:40

标签: c multithreading pthreads heap strdup

我遇到线程问题。

我正在定义一个全局变量,一个我初始化为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

2 个答案:

答案 0 :(得分:0)

你没有在主线程中等待新线程完成,所以你在线程开始设置其他东西之前就看到了null。此外,由于您没有使用锁保护变量,或者将其声明为volatile,编译器甚至可能已经优化注意到线程已更改它。

答案 1 :(得分:0)

我很抱歉,我意识到问题是什么,在executeRequest里面有些东西弄乱了那些变量,我真的不知道怎么会覆盖那个部分内存,但它是固定的。谢谢你,抱歉!