2011-08-24 91 views
1

創建線程時,會爲本地變量等分配其自己的存儲空間。何時或如何將其釋放回內存以供重用:線程何時結束?正在釋放線程內存

當一個線程試圖分配一個動態存儲時,它仍然存儲在線程的本地存儲中還是存儲在全局存儲中?

回答

2

線程的本地存儲來自堆棧,因此您不需要釋放它。只是結束線程沒問題。

而動態存儲是來自堆,所以你必須釋放分配的內存。

0

請記住 - 還有"thread local storage"(又名「TLS」)。這獨立於堆存儲(「new」或「malloc()」)或局部變量。像堆存儲一樣,您的應用程序將顯式分配TLS並明確釋放它。

0

嗯,這取決於。如果線程已分離,則在線程結束時不需要清理線程的資源。如果線程沒有分離,你可以調用(我不確定Solaris的細節)需要調用pthread_join或類似的東西來清理線程的資源。當然,你需要清理TLS和動態存儲。

+0

你能提供一個參考來支持這個答案嗎? – Arafangion

+0

請參見[pthread_join](http://pubs.opengroup.org/onlinepubs/000095399/functions/pthread_join.html),特別是理論部分第2段,其中說:「線程終止後,應用程序可以選擇清理資源...例如,在pthread_join()返回後,任何應用程序提供的堆棧存儲都可以被回收。「在特定實現上測試這種方法的一種方法是啓動一堆處於非分離狀態的線程,並查看它們使用的內存資源類型。用分離的線程重複。如果使用情況有所不同,我想這很重要。 – ldav1s

+0

@ Idav1s:有趣 - 這與我在Mac上看到的不同,顯然需要重新讀取Solaris上的所有這些文檔。 – Arafangion

0

線程爲堆棧中的函數數據或特殊的TLS(線程本地存儲)分配線程本地全局變量的本地存儲。堆上線程分配的任何東西一直保留,直到顯式釋放()d。