c-取消引用pthread_join设置的指针时的Segfault



我有以下代码用于测试如何使用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 %dn", retVal);
    return 0;
}

该程序编译得很好,但从未到达printf语句。在线路retVal = *retValPtr处发生分段故障。使用gdb,我可以看到retValPtr指针不再是NULL,但当我尝试print *retValPtr时,gdb会说"无法访问地址0x的内存…"。有什么建议吗?

最佳情况下,C函数无法返回指向堆栈上某个值的指针。然而,如果该堆栈是已终止的线程的堆栈,那么我们所说的是完全的灾难,因为该线程堆栈的内存可能不再映射——这里的情况似乎就是这样。

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

最新更新