1

我有线程问题。

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

当我使用堆时(通过调用malloc的strdup),我不明白为什么minURLTime在线程退出之前不是NULL,但是它是NULL。

pthread_exit(NULL);

一旦调用 pthread_exit,尽管 minURLTime 是一个通过 strdup(调用 malloc)分配的全局变量,它似乎为 NULL。没看懂,谁能解释一下?

非常感谢,

编辑:

再详细一点。

从主():

void *status;
pthread_t t;

pthread_create(&t, NULL, executeThread, (void *) &val);
pthread_join(t, &status);

执行线程函数:

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 之前)。

执行请求功能:

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 内部打印。

杰里

4

2 回答 2

1

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

于 2010-10-16T01:35:43.683 回答
0

抱歉,我意识到问题出在哪里,executeRequest 内部的某些东西弄乱了这些变量,我真的不知道它是如何完全覆盖内存的那部分,但它是固定的。谢谢和抱歉!

于 2010-10-16T02:17:46.480 回答