gcc 4.7 en linux pthreads - solución trivial thread_local usando __thread (sin impulso)

En C ++ 11 puede tener un objeto no trivial con almacenamiento thread_local:

class X { ... }

void f()
{
    thread_local X x = ...;
    ...
}

Desafortunadamente, esta característica aún no se ha implementado en gcc (a partir de 4.7).

gcc le permite tener variables locales de subprocesos pero solo con tipos triviales.

Estoy buscando una solución:

Aquí está lo que tengo hasta ahora:

#include <iostream>
#include <type_traits>

using namespace std;

class X
{
public:
    X() { cout << "X::X()" << endl; };
    ~X() { cout << "X::~X()" << endl; }
};

typedef aligned_storage<sizeof(X), alignment_of<X>::value>::type XStorage;

inline void placement_delete_x(X* p) { p->~X(); }

void f()
{
        static __thread bool x_allocated = false;
        static __thread XStorage x_storage;

        if (!x_allocated)
        {
                new (&x_storage) X;
                x_allocated = true;

                // TODO: add thread cleanup that
                //     calls placement_delete_x(&x_storage)
        }

        X& x = *((X*) &x_storage);
}

int main()
{
        f();
}

Con lo que necesito ayuda es llamar a placement_delete_x (& x_storage) al salir del hilo actual. ¿Hay algún mecanismo en pthreads y / o linux que pueda usar para hacer esto? ¿Necesitaría agregar un puntero de función y un parámetro a algún tipo de pila de limpieza pthread?

Actualizar:

Yo creo quepthread_cleanup_push podría ser lo que quiero:

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_cleanup_push.3.html

¿Llamará esto al manejador de limpieza en las circunstancias correctas para este uso?

Actualización 2:

Parece queboost::thread_specific_ptr finalmente llamapthread_key_create con eldestructor parámetro, y nopthread_cleanup_push - para llamar a su función de limpieza tls:

http://pubs.opengroup.org/onlinepubs/009696799/functions/pthread_key_create.html

No está claro cuál es la diferencia entre estos dos métodos, si los hay. ?

Respuestas a la pregunta(2)

Su respuesta a la pregunta