Eh bien, il y a en fait 2 questions:
- thread qui exécutera la première
- sera l'ID du sujet sera sauvé avant les mises en chantier de fil.
Cette réponse concerne Linux, car je n'ai pas d'autres plateformes disponibles. La réponse à la première question se trouve in the manuals:
À moins en temps réel politiques de planification sont en cours d'un emploi, après un appel à pthread_create()
, il est indéterminée qui thread l'appelant ou le nouveau thread volonté Ensuite, exécutez.
Il est donc clair que dans votre cas, il est indéterminé quel thread sera réellement exécuté en premier. Maintenant, une autre question est comment est pthread_create
mis en œuvre - si elle pourrait en quelque sorte créer un thread dormant, en stockant son identifiant d'abord, puis plus tard le démarrer?
Eh bien, Linux crée un nouveau thread en utilisant l'appel système clone
:
clone(child_stack=0x7f7b35031ff0,
flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM
|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID,
parent_tidptr=0x7f7b350329d0,
tls=0x7f7b35032700,
child_tidptr=0x7f7b350329d0) = 24009
Maintenant, il semble que l'ID de fil est stocké avec un pointeur de l'appel clone
, mais il semble clair que child_tidptr
n » t se référer à l'adresse detid
, comme si je l'imprime, l'adresse est différente; c'est une variable interne dans la bibliothèque pthread
; et tid
serait mis à jour après l'appel système clone
renvoie dans le thread parent.
Et en effet, pthread_self
dit le texte suivant:
L'ID du thread retourné par pthread_self()
est pas la même chose que l'ID du thread noyau renvoyé par un appel à gettid(2)
.
Cela confirme que les ids de fil du noyau sont distincts de pthread_t
s
Ainsi, en plus de cela pas pris en charge par le POSIX spec, il n'y a aucune garantie sur la plate-forme Linux dans la pratique - la tid
sera doit être défini dans le thread parent après clone
renvoie, sinon le parent ne connaîtrait pas immédiatement l'ID de thread de l'enfant - mais cela signifie également que si l'enfant est le premier à exécuter après le retour, alors le l'ID de thread peut ne pas être défini pour le moment.
"Quand la routine transmise à pthread_create démarre-t-elle?", Après l'appel de 'pthread_create()'? Votre question n'est pas claire. "Est-ce que la routine peut TOUJOURS obtenir le bon tid?" Que voulez-vous dire ? – Stargateur
Vous passez '& tid' comme premier argument de' pthread_create' (l'endroit où 'pthread_create' devrait stocker l'ID du nouveau thread) et le quatrième argument de' pthread_create' (un argument à passer dans 'pt_routine') . Cela * sonne * comme si vous demandiez s'il est possible que 'pt_routine' s'exécute et déréférence son' arg' avant que 'pthread_create' ait stocké l'ID du thread à cette adresse. Est-ce exact? – Wyzard