gcc 4.7 unter Linux pthreads - nicht-triviale Lösung für thread_local mit __thread (kein Boost)

In C ++ 11 können Sie ein nicht triviales Objekt mit thread_local-Speicher haben:

class X { ... }

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

Leider wurde diese Funktion in gcc noch nicht implementiert (Stand 4.7).

Mit gcc können Sie Thread-lokale Variablen haben, aber nur mit trivialen Typen.

Ich suche nach einem Workaround:

Folgendes habe ich bisher:

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

Ich brauche Hilfe beim Aufrufen von placement_delete_x (& x_storage) beim Beenden des aktuellen Threads. Gibt es einen Mechanismus in pthreads und / oder Linux, den ich dazu verwenden kann? Ich würde einen Funktionszeiger und einen Parameter zu irgendeiner Art von pthread-Bereinigungsstapel hinzufügen müssen?

Aktualisieren:

Meiner Ansicht nachpthread_cleanup_push könnte sein was ich will:

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

Ruft dies den Bereinigungs-Handler unter den richtigen Umständen für diese Verwendung auf?

Update 2:

Es sieht aus wieboost::thread_specific_ptr ruft schließlich anpthread_key_create mit demdestructor Parameter und nichtpthread_cleanup_push - um die tls-Bereinigungsfunktion aufzurufen:

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

Es ist nicht klar, worin der Unterschied zwischen diesen beiden Methoden besteht. ?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage