0

我已經使用線程本地存儲這樣的結構:如何釋放線程本地存儲的堆內存

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

+0

我明白了,你能否給出一個更多閱讀的參考。謝謝 – rahman 2014-10-31 02:24:04

+1

請閱讀http://www.obost.org/doc/libs/1_56_0/doc/html/thread/thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr處的'thread_specific_ptr'文檔 – 2014-10-31 02:39:08