Los cuatro hilos tendrán el mismo PID pero solo cuando se vean desde arriba. Lo que usted (como usuario) llama un PID no es lo que el núcleo (mirando desde abajo) llama un PID.
En el kernel, cada hilo tiene su propio ID, llamado PID (aunque posiblemente tendría más sentido llamarlo TID, o ID de hilo) y también tienen un TGID (ID de grupo de hilo) que es el PID del hilo que inició todo el proceso.
De manera simplista, cuando se crea un nuevo proceso , aparece como un hilo en el que tanto el PID como el TGID son el mismo (nuevo) número.
Cuando un subproceso inicia otro subproceso, ese subproceso iniciado obtiene su propio PID (por lo que el programador puede programarlo de forma independiente) pero hereda el TGID del subproceso original.
De esa manera, el kernel puede programar subprocesos independientemente del proceso al que pertenecen, mientras que los procesos (ID de grupo de subprocesos) se le informan.
La siguiente jerarquía de subprocesos puede ayudar (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
Puede ver que comenzar un nuevo proceso (a la izquierda) le brinda un nuevo PID y un nuevo TGID (ambos configurados con el mismo valor), mientras que comenzar un nuevo hilo (a la derecha) le brinda un nuevo PID mientras mantiene el mismo TGID como el hilo que lo inició.
(a) Temblar de asombro ante mis impresionantes habilidades gráficas :-)
getpid()
devuelve tgid:,asmlinkage long sys_getpid(void) { return current->tgid;}
como se muestra en www.makelinux.com/