如何释放线程本地存储的堆内存

Posted

技术标签:

【中文标题】如何释放线程本地存储的堆内存【英文标题】:How to release heap memory of thread local storage 【发布时间】:2014-10-31 01:54:12 【问题描述】:

我有一个用于线程本地存储的结构,如下所示:

namespace 
 typedef boost::unordered_map< std::string, std::vector<xxx> > YYY;
 boost::thread_specific_ptr<YYY> cache;

 void initCache() 
     //The first time called by the current thread.
     if (!cache.get())
         cache.reset(new YYY());
     
 

void clearCache() 
     if (cache.get())
         cache.reset();
     


还有一个类,其对象可能由main thread 创建:

class A 
public:
    void f() 
        initCache();
        //and for example:
        insertIntoCache();
    
    ~A()
        clearCache();// <-- Does/Can this do anything good ??
    

多个线程可以访问存储在例如全局容器中的A 的对象。这些线程中的每一个都需要不时调用A::f()。因此,他们在 heap 上创建了自己的 cache 副本,并在完成所有工作后最终加入。

所以问题是:谁来清理线程的内存?如何? 谢谢

【问题讨论】:

【参考方案1】:

没有理由打电话给clearCache()

一旦线程退出或thread_specific_ptr 超出范围,就会调用清理函数。如果你不将清理函数传递给thread_specific_ptr 的构造函数,它只会使用delete

【讨论】:

我明白了,请您提供参考以供更多阅读。谢谢 阅读thread_specific_ptrboost.org/doc/libs/1_56_0/doc/html/thread/…的文档

以上是关于如何释放线程本地存储的堆内存的主要内容,如果未能解决你的问题,请参考以下文章

内存的划分

[线程本地存储 · 语雀 (yuque.com)](https://www.yuque.com/haofeiyu/java/oz8uve) 线程本地存储提供了线程内存储变量的能力,这些变量是线程私有

串的堆分配存储结构

ThreadLocal 方式存储用户信息

GPU存储器架构-- 全局内存 本地内存 寄存器堆 共享内存 常量内存 纹理内存

基础才是重中之重~内存里的堆和栈