2016-03-03 39 views
2

我偶然發現了一個代碼示例herepthread_join(thread_id,&res),如果&res不是NULL - 是否需要空閒(res)?

{ 
... 
void *res; 
... 
s = pthread_join(tinfo[tnum].thread_id, &res); 
... 
free(res);  /* Free memory allocated by thread */ 
} 

任何人都可以深入到並行線程比我在free(res)發表評論,請:引起我的注意(所有其他行跳過)的線?我不得不說,我從來沒有見過這種情況,而使用谷歌搜索1-1.5小時並沒有給我任何其他類似的例子。

回答

2

在在pthread_join(thread_id單,&水庫),如果&資源不爲空 - 是免費的(RES) 需要的?

它取決於線程的返回值是否動態分配(使用malloc() & co)。

如果你看同一頁上的功能thread_start(),你會看到它有一個return語句:

 uargv = strdup(tinfo->argv_string); 

因此,free()

return uargv; 

uagrv與分配呼叫在撥打pthread_join()後用於main()。 因爲res是填充uargv(由線程返回)。您可以在概念上假設有像這裏面pthread_join()功能代碼:

if (res) 
    *res = uargv; 

下面是它的使用strdup()(它在內部分配內存)進行分配。所以你free()吧。如果線程只有return NULL;(和free()的uargv本身),那麼你不需要free()

一般的答案是,如果您使用malloc()家庭功能分配某些東西,那麼您需要free()

+0

刪除,與引擎戰鬥;) –

+0

感謝您的及時回覆。我錯過了strdup()(或者,而是在讀取時將它自動轉換爲alloca(),但alloca()不允許用於此目的)。實際上,你給了我一個思考的新方向......我以某種方式假定一旦線程(正確)終止,它的資源就會被系統自動釋放(在手冊頁排除中明確提到了一些)。 –

+0

感謝您的及時回覆。我錯過了strdup()。你實際上給了我一個思考的新方向。我以某種方式假設一旦一個線程被(正確)終止,它的資源就會被系統自動釋放(在手冊頁例外中有一些明確提到):「如果線程可以連接,則另一個線程可以調用pthread_join(3)等待線程終止並獲取其退出狀態,只有當一個終止的可連接線程加入後,才能釋放回系統的最後一個資源。「 –