0

나는이 같은 스레드 로컬 저장소에 사용되는 구조를 가지고 그 객체입니다 main thread에 의해 생성 된 수스레드 로컬 저장소의 힙 메모리를 해제하는 방법

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(); 
    } 
} 
} 

그리고 클래스 :

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

다중 스레드는 예를 들어 글로벌 컨테이너에 저장된 A의 객체에 액세스 할 수 있습니다. 이 스레드는 각각 A::f()을 호출해야합니다. 그래서 그들은 사본을 heap에 한번 작성하고, 모든 작업을 마쳤을 때 마침내 참여합니다.

문제는 다음과 같습니다. 누가 스레드 메모리를 정리할 것입니까? 그리고 어떻게? 감사합니다.

답변

1

clearCache()으로 전화 할 이유가 없습니다.

스레드가 종료되거나 thread_specific_ptr이 범위를 벗어나면 정리 기능이 호출됩니다. thread_specific_ptr의 생성자에 정리 기능을 전달하지 않으면 delete 만 사용됩니다.

+0

더 많은 정보를 원하시면 참고 자료를 제공해주십시오. 덕분에 – rahman

+1

http://www.boost.org/doc/libs/1_56_0/doc/html/thread/thread_local_storage.html#thread.thread_local_storage.thread_specific_ptr에서'thread_specific_ptr'에 대한 문서를 읽어보십시오. –