2017-01-06 2 views
2

Sur Linux un thread est identifié par un pthread_t ou un TID. Je cherche des ponts entre ces deux types de fil ids:Y at-il un moyen de lier un thread TID de linux et un "thread ID" pthread_t

  • donné un pthread_t puis-je obtenir c'est TID? apparently pas sans le piratage dans les parties internes de pthread :(mais je demande toujours au cas où quelqu'un a une façon propre de le faire.
  • donné un TID (ou PID), puis-je obtenir une poignée pthread_t à elle?

Parce que le terme "id fil" est ambigu dans ce contexte (et dans la documentation), un peu de fond:

  • l'API pthread définit un type POSIX pthread_t, al l les fonctions qui requièrent/agissent sur un thread utilisent un argument pthread_t, et nous pouvons obtenir une telle manipulation par exemple. avec pthread_self(). La documentation appelle ces "identificateurs de threads", mais ici je les appelle descripteurs pour désambiguïser, car plusieurs valeurs pthread_t différentes peuvent représenter le même thread, d'où la nécessité de pthread_equal(pthread_t, pthread_t). D'autre part, sur linux au moins, il existe un concept de TID s ou des identifiants de threads. On peut obtenir le TID actuel avec un appel système: syscall(SYS_gettid). Le TID a quelques propriétés intéressantes comme étant unique à un fil, et comparable à PID s, ce qui permet d'identifier facilement le fil conducteur, etc.

+0

Que comptez-vous faire avec 'TID'? –

+0

@MaximEgorushkin: débogage/traçage plus facile (puisqu'il est unique), effectuant des opérations sur le thread principal à partir d'un autre thread ou utilisant des fonctions thread spécifiques à linux qui ne sont pas extraites par pthread. – Antoine

Répondre

2

Malheureusement, il n'y a aucun moyen portable de le faire parce que there is no requirement for pthread_t to map to tid:

Les implémentations peuvent choisir de définir un ID de thread en tant que structure. Cela permet une flexibilité et une robustesse supplémentaires par rapport à l'utilisation d'un int. Par exemple, un ID de thread pourrait inclure un numéro de séquence qui permet la détection des "ID qui pendent" (copies d'un ID de thread qui a été détaché). Puisque le langage C ne supporte pas la comparaison sur les types de structure, la fonction pthread_equal() est fournie pour comparer les ID de threads.

Historiquement, avant NPTL, pthread_t n'a pas la carte 1 à 1 à tid.

Vous devez utiliser les détails d'implémentation de la bibliothèque pthreads pour consulter tid. Je ne recommanderais pas de le faire parce qu'un tel code ne serait pas portable.

Par souci de curiosité seulement, avec glibc, pthread_t is a struct pthread *:

27 int 
28 __pthread_kill (pthread_t threadid, int signo) 
29 { 
30 struct pthread *pd = (struct pthread *) threadid; 
... 
40 pid_t tid = atomic_forced_read (pd->tid); 

Et pthread is:

122 /* Thread descriptor data structure. */ 
123 struct pthread 
124 { 
... 
166 /* Thread ID - which is also a 'is this thread descriptor (and 
167  therefore stack) used' flag. */ 
168 pid_t tid; 
+0

triste, mais merci pour l'exemple de la glibc de toute façon.Qu'en est-il de l'inverse? Y a-t-il un truc pour obtenir un 'pthread_t' d'un pid/tid? – Antoine

+1

'extern structure pthread * __ find_thread_by_id (pid_t tid) attribut_hidden', notez l'attribut. Aussi 'struct pthread * self = THREAD_SELF;' –