У меня проблема с потоками.Проблема с потоками: значение, хранящееся в куче
Я определяю глобальную переменную, 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
Что заставляет вас поверить, что minURLTime NULL? Как вы оцениваете его ценность? – Ray
Я просто печатаю на stderr: if (minURLTime! = NULL) fprintf (stderr, "\ nURL:% s \ n", minURLTime); – Jary