2011-09-16 165 views
3

我有一個關於從pthread執行函數返回結果的問題。Pthread返回結果

相關代碼:

void* thread_func(void* args) 
{ 
    float result = 0; 
    // ...do something 
    return (void*)&result; 
} 

// ... using code 
float answer; 
pthread_join(pthread_handle, &answer); 

對我來說,似乎這種解決方案並不像它應該安全地工作,因爲result將駐留的thread_func在堆棧上並停止後thread_func回報存在。然而,在我所做的所有測試中,它似乎完美無缺地工作。有什麼我誤解爲什麼這是安全的?如果不是這樣,我的測試只是偶然發生,我如何安全地從thread_func安全返回值?

+0

這絕對不行,最有可能的是你沒有完全測試過。嘗試'valgrind'開始。 –

回答

10

這是不安全的。你很幸運(或者倒黴)。函數結束後,所有自動變量都會丟失(因此指向它們的指針是無用的)。

  • 使用malloc並返回內存
  • 使用一個靜態的對象(例如一個全局變量)
  • 使用內存的功能,通過將加入

總之使用一些內存將在函數結束後繼續存在。

+0

在我的通話代碼中,我可以撥打免費(&answer)嗎?或者我還必須將其更改爲浮動*答案,然後在完成返回結果後請求免費(答案)? – helloworld922

+1

'免費(&答)'**從來沒有**有效的C.你將不得不做後者。 –

+0

@ helloworld922只有通過'malloc'獲得的東西纔會調用'free'。第二個選擇似乎很好。 – cnicutar