Les quatre threads auront le même PID mais uniquement lorsqu'ils sont vus d'en haut. Ce que vous (en tant qu'utilisateur) appelez un PID n'est pas ce que le noyau (en regardant d'en bas) appelle un PID.
Dans le noyau, chaque thread a son propre ID, appelé PID (bien qu'il serait peut-être plus logique d'appeler cela un TID, ou ID de thread) et ils ont également un TGID (ID de groupe de threads) qui est le PID du thread qui a commencé tout le processus.
De manière simpliste, lorsqu'un nouveau processus est créé, il apparaît comme un thread où le PID et le TGID sont le même (nouveau) numéro.
Lorsqu'un thread démarre un autre thread, ce thread démarré obtient son propre PID (afin que le planificateur puisse le planifier indépendamment) mais il hérite du TGID du thread d'origine.
De cette façon, le noyau peut planifier avec plaisir les threads indépendamment du processus auquel ils appartiennent, tandis que les processus (ID de groupe de threads) vous sont signalés.
La hiérarchie suivante des fils peut aider (a) :
USER VIEW
<-- PID 43 --> <----------------- PID 42 ----------------->
+---------+
| process |
_| pid=42 |_
_/ | tgid=42 | \_ (new thread) _
_ (fork) _/ +---------+ \
/ +---------+
+---------+ | process |
| process | | pid=44 |
| pid=43 | | tgid=42 |
| tgid=43 | +---------+
+---------+
<-- PID 43 --> <--------- PID 42 --------> <--- PID 44 --->
KERNEL VIEW
Vous pouvez voir que le démarrage d'un nouveau processus (à gauche) vous donne un nouveau PID et un nouveau TGID (tous deux définis sur la même valeur), tandis que le démarrage d'un nouveau thread (à droite) vous donne un nouveau PID tout en conservant le même TGID comme thread qui l'a démarré.
(a) Trembler d'émerveillement devant mes impressionnantes compétences graphiques :-)
getpid()
renvoie tgid:,asmlinkage long sys_getpid(void) { return current->tgid;}
comme indiqué sur www.makelinux.com/