Segfault при разыменовании указателя, установленного pthread_join - PullRequest
1 голос
/ 13 марта 2012

У меня есть следующий код для проверки того, как «реализовать возвращаемые значения», используя pthread_exit() и pthread_join().

#include <stdio.h>
#include <pthread.h>

void* busy() {

    int returnValue = 2;
    pthread_exit((void*)&returnValue);

}


int main() {

    void* retVoidPtr = NULL;
    int* retValPtr = NULL;
    int retVal;

    pthread_t busyThread;
    pthread_create(&busyThread, NULL, busy, NULL);
    pthread_join(busyThread, &retVoidPtr);
    retValPtr = (int*) retVoidPtr;
    retVal = *retValPtr;

    printf("Busy thread returned %d\n", retVal);

    return 0;

}

Программа компилируется нормально, но никогда не попадает в оператор printf. Segfault происходит на линии retVal = *retValPtr. Используя gdb, я вижу, что указатель retValPtr больше не NULL, но когда я пытаюсь print *retValPtr, gdb говорит: «Не удается получить доступ к памяти по адресу 0x ...». Любые предложения, где я иду не так?

1 Ответ

8 голосов
/ 13 марта 2012

Функция C не может вернуть указатель на значение в стеке при лучших обстоятельствах. Если этот стек является стеком потока, который завершился, мы говорим о полной катастрофе, так как память для стека этого потока может больше не отображаться - это похоже на случай здесь.

Ваша функция потока должна возвращать указатель на данные, которые останутся действительными после завершения потока: глобальная переменная или блок, полученный из malloc().

...