Pthread Thread-Local-Singleton, когда выпустить ключ TLS?
Я реализовал своего рода "нить местный синглтон " используя pthread TLS, и я подумал, как (и когда) я мог бы удалить pthread_key_t в этом случае, потому что, как сейчас, память, используемая ключом TLS, никогда не будет свободнойд.
Предполагается, что этот класс будет производным от ThreadLocalSingleton <A>. что делает A локальным синглтоном потока, при условии, что A имеет только частные конструкторы и ThreadLocalSingleton <A> друг А.
Ох, а также - вы видите какие-либо проблемы с этой реализацией; я пропустил что-нибудь важное?
#include
#include
template
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
pthread_key_t ThreadLocalSingleton::tlsKey;
template
pthread_once_t ThreadLocalSingleton::tlsKey_once = PTHREAD_ONCE_INIT;