2011-08-24 51 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。