2010-06-17 2 views
2

Je travaille sur une plateforme mobile sur Nucleus RTOS. Il utilise le système Nucleus Threading mais ne prend pas en charge les API de stockage local de threads explicites i.e, TlsAlloc, TlsSetValue, TlsGetValue, TlsFree. La plateforme n'a pas non plus de pthreads d'espace utilisateur.comment émuler le stockage local de thread à l'espace utilisateur en C++?

J'ai trouvé que le modificateur de stockage __thread est présent dans la plupart des compilateurs C++. Mais je ne sais pas comment le faire fonctionner pour mon genre d'utilisation. Comment le mot-clé __thread peut-il être mappé avec le stockage local de threads explicite? Je lis beaucoup d'articles mais rien n'est si clair pour me donner les informations de base suivantes

  1. va __thread variable différente pour chaque thread?
  2. Comment écrire et lire? chaque thread a-t-il exactement une copie de la variable?

suivante est la mise en œuvre basée pthread:

pthread_key_t m_key; 

struct Data : Noncopyable { 
     Data(T* value, void* owner) : value(value), owner(owner) {} 


     int* value; 

    }; 


inline ThreadSpecific() 
{ 
    int error = pthread_key_create(&m_key, destroy); 
    if (error) 
     CRASH(); 
} 

inline ~ThreadSpecific() 
{ 
    pthread_key_delete(m_key); // Does not invoke destructor functions. 
} 

inline T* get() 
{ 
    Data* data = static_cast<Data*>(pthread_getspecific(m_key)); 
    return data ? data->value : 0; 
} 

inline void set(T* ptr) 
{ 
    ASSERT(!get()); 
    pthread_setspecific(m_key, new Data(ptr, this)); 
} 

Comment faire la façon d'utiliser le code ci-dessus __thread pour définir & obtenir une valeur spécifique? où/quand la suppression create & se produit-elle?

Si cela n'est pas possible, comment écrire des API pthread_setspecific, pthread_getspecific personnalisées.

J'ai essayé d'utiliser une carte globale C++ et je l'ai indexée de manière unique pour chaque thread et les données extraites. Mais ça n'a pas bien marché.

Répondre

1

J'ai toujours utilisé la bibliothèque ACE lorsque j'avais besoin de stockage local de threads. Je ne sais pas si c'est disponible pour votre système. Si oui, consultez la classe ACE_TSS.

Pour le mot-clé __thread, il y a un wikipedia page, où il est décrit.