gcc 4.7 na linux pthreads - nietrywialne obejście thread_local przy użyciu __thread (bez doładowania)

W C ++ 11 możesz mieć nietrywialny obiekt z pamięcią thread_local:

class X { ... }

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

Niestety ta funkcja nie została jeszcze zaimplementowana w gcc (od wersji 4.7).

gcc pozwala ci na posiadanie zmiennych lokalnych wątku, ale tylko z trywialnymi typami.

Szukam obejścia:

Oto, co mam do tej pory:

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

Potrzebuję pomocy w wywołaniu placement_delete_x (& x_storage) na wyjściu z bieżącego wątku. Czy istnieje mechanizm w pthreads i / lub linux, którego mogę użyć do tego celu? Chciałbym dodać wskaźnik funkcji i parametr do pewnego rodzaju stosu czyszczenia pthread?

Aktualizacja:

Myślępthread_cleanup_push&nbsp;może tego chcę:

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

Czy wywoła to procedurę czyszczenia w odpowiednich okolicznościach dla tego użycia?

Aktualizacja 2:

To wygląda jakboost::thread_specific_ptr&nbsp;w końcu dzwonipthread_key_create&nbsp;zdestructor&nbsp;parametr, a niepthread_cleanup_push&nbsp;- aby wywołać funkcję czyszczenia tls:

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

Nie jest jasne, jaka jest różnica między tymi dwiema metodami, jeśli w ogóle istnieje. ?