2012-03-13 41 views
1

我有以下代碼用於測試如何使用pthread_exit()pthread_join()「實現返回值」。段引用由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聲明。段錯誤發生在線retVal = *retValPtr。使用gdb,我可以看到retValPtr指針不再是NULL,但是當我嘗試print *retValPtr gdb說:「無法訪問地址0x ...處的內存」。任何建議,我哪裏出錯了?

回答

8

C函數無法將指針返回到棧下的某個值的情況下的最佳值最佳值。但是,如果該堆棧是終止線程的堆棧,那麼我們正在談論完全災難,因爲該線程堆棧的內存可能不再被映射 - 這似乎就是這種情況。

您的線程函數需要返回一個指向數據的指針,該數據在線程終止時將保持有效:全局變量或從malloc()獲取的塊。

+1

感謝您的解釋。應該更仔細地看一下'pthread_exit'手冊頁。 – simon 2012-03-13 13:48:12