2013-04-22 2 views
5

pthread TLSを使ってある種の「スレッドローカルシングルトン」を実装しましたが、今のところTLSキーで使用されるメモリが決して使用されないため、このケースではpthread_key_tをどのように削除できるのかと思いました。無料です。Pthreadスレッドローカル - シングルトン、TLSキーを解放するのはいつですか?

本の使用目的は、クラスAはAだけプライベートコンストラクタとを持っていることをThreadLocalSingleton < >を想定して、スレッドローカルなシングルトンを作る>はAの友人であるThreadLocalSingleton <から派生させることです

ああ、また、その実装に関する問題は見えますか?私は何か重要なものを見落としましたか?

#include <pthread.h> 
#include <iostream> 

template <class T> 
class ThreadLocalSingleton 
{ 
private: 
    static pthread_key_t tlsKey; 
    static pthread_once_t tlsKey_once; 

    static void tls_make_key() 
    { 
     (void)pthread_key_create(&ThreadLocalSingleton::tlsKey, ThreadLocalSingleton::tls_destructor); 
    } 

    static void tls_destructor(void* obj) 
    { 
     delete ((T*)obj); 
     pthread_setspecific(tlsKey, NULL); // necessary or it will call the destructor again. 
    } 

public: 

    /* 
    * A thread-local singleton getter, the resulted object must never be released, 
    * it is auto-released when the thread exits. 
    */ 
    static T* getThreadInstance(void) 
    { 
     pthread_once(&tlsKey_once, ThreadLocalSingleton::tls_make_key); 
     T* instance = (T*)pthread_getspecific(tlsKey); 
     if(!instance) 
     { 
      try 
      { 
       instance = new T; 
       pthread_setspecific(tlsKey, instance); 
      } 
      catch (const char* ex) 
      { 
       printf("Exception during thread local singleton init: %s\n",ex); 
      } 
     } 
     return instance; 
    } 
}; 
template <class T> 
pthread_key_t ThreadLocalSingleton<T>::tlsKey; 
template <class T> 
pthread_once_t ThreadLocalSingleton<T>::tlsKey_once = PTHREAD_ONCE_INIT; 
+0

[The Linux Programming Interface:A Linux and UNIX System Programming Handbook](http://www.amazon.com/dp/1593272200)のKerriskによると、あなたは*スレッド固有データ*( 'pthread_key_create 'and friends)ではなく* Thread Local Storage *(静的変数とグローバル変数の' __thread'キーワード)です。 – jww

答えて

2

あなたの実装はとてもエレガントです。

Open Group Specification of pthread_key_createによると、あなたはデストラクタでNULLへの参照を設定する必要はありません。

オプションのデストラクタ関数は、各キーの値に関連付けすることができます。スレッド出口で、キー値に非NULLデストラクタポインタがあり、そのスレッドにそのキーに関連付けられたNULL以外の値がある場合、そのキーの値はNULLに設定され、次に指された関数がそれ以前に関連付けられた値を唯一の引数として使用します。

これは、キーオブジェクト自体がpthreadによって自動生成されることを意味するとも考えられます。キーの後ろに保存されているものを気にする必要があります。これはあなたのdelete ((T*)obj);とまったく同じです。

関連する問題