解除引用由pthread_join设置的指针时的Segfault

时间:2012-03-13 13:39:06

标签: c pthreads segmentation-fault

我有以下代码,用于测试如何使用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语句。段{000}处发生了段错误。使用gdb,我可以看到retVal = *retValPtr指针不再是retValPtr但是当我尝试NULL gdb说“无法访问地址0x处的内存......”时。我出错的任何建议?

1 个答案:

答案 0 :(得分:8)

C函数无法在最佳情况下返回指向堆栈上的值的指针。但是,如果该堆栈是已终止的线程的堆栈,那么我们正在谈论完全的灾难,因为该线程的堆栈的内存可能不再被映射 - 这似乎就是这里的情况。

您的线程函数需要返回一个指向数据的指针,该指针在线程终止时仍然有效:全局变量或从malloc()获得的块。