Pthread Thread-Local-Singleton, ¿cuándo liberar la clave TLS?

Implementé una especie de "thread local singleton" usando pthread TLS, y me pregunté cómo (y cuándo) posiblemente podría eliminar pthread_key_t en este caso, porque tal como está ahora, la memoria utilizada por la tecla TLS nunca será libre ". re.

El uso previsto de esto es permitir que una clase A se derive de ThreadLocalSingleton <A>, lo que hace que A se convierta en un singleton local, asumiendo que A solo tiene constructores privados y ThreadLocalSingleton <A> es amigo de A.

Ah, y también, ¿ves algún problema con esa implementación; ¿Pasé por alto algo importante?

#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;

Respuestas a la pregunta(1)

Su respuesta a la pregunta