C++11: Non Trivial Thread Local Variable Statique?

J'ai une classe X:

class X { ... }

Je veux faire ceci:

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

    ...
}

(en fait, je suis en utilisant gcc si le mot clé est "__thread")

mais je ne peux pas parce que vous ne pouvez avoir trivial thread_locals.

Quelle est la meilleure façon de contourner ce pour cela?

Si je le fais de cette façon:

void f()
{
    thread_local static X* p = 0;

    if (!p)
       p = new X(...);

    X& x = *p;

    ...
}

alors:

  1. le destructeur ne sera pas appelé lorsque le thread sorties
  2. inutile allocation dynamique de la mémoire.

Mise à jour:

Voici ce que j'ai à ce jour:

#include <iostream>
#include <type_traits>

using namespace std;

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

void f()
{
        static __thread bool x_allocated = false;
        static __thread aligned_storage<sizeof(X),
             alignment_of<X>::value>::type x_storage;

        if (!x_allocated)
        {
                new (&x_storage) X;
                x_allocated = true;
                //add thread cleanup that calls destructor
        }

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

int main()
{
        f();
}

Cela corrige l'allocation dynamique de la mémoire de problème. J'ai juste besoin d'ajouter le thread de nettoyage de gestionnaire. Est-il un mécanisme pour ce faire avec les pthreads?

Pourquoi vous ne pouvez avoir qu'trivial thread-habitants? Par de la norme?
J'ai pensé alors? GCC ne semble pas comme elle.
Je ne pense pas que le standard a de telles restrictions, et GCC ne pas mettre en œuvre de C++11 thread local storage encore.
gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Thread_002dLocal.html
C'est un gcc extension, pas du C++11 thread_local. Voir ici. Donc, chaque fois qu'il est mis en place, vous n'aurez pas le problème de la trivialité.

OriginalL'auteur Andrew Tomazos | 2012-08-21