2010-10-16 3 views
1

У меня проблема с потоками.Проблема с потоками: значение, хранящееся в куче

Я определяю глобальную переменную, char *, которую я инициализирую в 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 (который вызывает таНос), то, как представляется, значение 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

+0

Что заставляет вас поверить, что minURLTime NULL? Как вы оцениваете его ценность? – Ray

+0

Я просто печатаю на stderr: if (minURLTime! = NULL) fprintf (stderr, "\ nURL:% s \ n", minURLTime); – Jary

ответ

0

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

+0

Я положил вокруг него mutex_lock, извините. Значит, мне нужно сделать pthread_join? Спасибо! – Jary

+0

pthread_join должен это сделать, да. – bmargulies

+0

Он все еще не работает, я обновлю свой предыдущий код. – Jary

0

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

+0

Не нужно извиняться, человек! Мы все здесь, чтобы помочь. – slezica

+0

Чтобы найти такие проблемы, отладчик должен использовать «break on write» или аналогичные точки останова. Это мгновенно сообщит, кто (или как) запишет вашу память. :) –