Проблема с потоками: значение хранится в куче - PullRequest
1 голос
/ 16 октября 2010

У меня проблема с темами.

Я определяю глобальную переменную, символ *, который я инициализирую в NULL, и мьютекс.

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);

И внутри этой функции я выделяю пространство для minURLTime с помощью strdup и копирую строку из ссылки:

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. Я не понимаю, может кто-нибудь объяснить мне?

Большое спасибо,

EDIT:

Немного подробнее.

Из основного ():

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 голосов
/ 16 октября 2010

Мои извинения, я понимаю, в чем проблема, это было что-то внутри executeRequest, которое мешало с этими переменными, я действительно не знаю, как это могло перезаписать именно ту часть памяти, но это исправлено. Спасибо и извините!

0 голосов
/ 16 октября 2010

Вы не ожидаете в главном потоке завершения нового потока, поэтому вы видите нулевое значение, прежде чем поток сможет установить что-то еще. Кроме того, поскольку вы не защитили переменную блокировкой или не объявили ее энергозависимой, компилятор мог бы даже оптимизировать, заметив, что поток ее изменил.

...