2010-06-27 2 views
1

J'ai un type de données thread dans l'implémentation de l'interpréteur pour un langage de programmation sur lequel je travaille. Pour diverses raisons, il s'agit d'une opération assez courante, pour obtenir le actuelthread (qui est lui-même un pointeur: un struct thread*).Comment puis-je inverser (hachage) `pthread_t`s pour structurer des pointeurs?

Cependant, pthread_self(3) me donne un pthread_t, qui est un type opaque; sur certains systèmes, il semble être un unsigned long, mais j'entends que je ne peux pas dépendre de cela étant le cas. Je soupçonne qu'une table de hachage est l'implémentation correcte de ce mappage unique (pthread_t ID au pointeur struct thread); Cependant, je n'ai aucune idée de comment hash le pthread_t de manière fiable.

J'apprécierais le conseil de n'importe qui avec plus d'expérience avec pthread(3) ou, vraiment, n'importe quelle situation où vous devez "hacher" un type de données opaque.

+0

Si c'est un type opaque, vous ne pouvez vraiment pas de hachage, puisque vous Je ne sais pas comment c'est grand. – Spudd86

Répondre

5

Je pense que la meilleure façon de stocker votre struct thread* est le stockage local. Quelque chose comme:

static pthread_key_t struct_thread_key; 
pthread_key_create(&struct_thread_key, NULL); 

Dans le fil initalizer:

struct thread *my_thread = malloc(sizeof(*my_thread)); 
// ... 
pthread_setspecific(struct_thread_key, my_thread); 

Pour accéder au thread courant plus tard:

struct thread *my_thread = (struct thread *) pthread_getspecific(struct_thread_key); 
+0

pourquoi n'y ai-je pas pensé ... – Spudd86

+0

Je ne suis pas familier avec le stockage local, mais cela peut poser problème: le 'thread' doit être accessible à partir d'autres threads d'exécution: c'est un logiciel de première classe type de données, qui peut être transmis librement. Il obtient seulement le 'thread' pour le thread d'exécution * en cours d'exécution, comme l'une de ces références de première classe, c'est problématique ... – ELLIOTTCABLE

+0

@elliott, après avoir appelé' getspecific', vous pouvez passer 'my_thread'. Vous devrez peut-être faire la synchronisation, bien sûr. –