I quattro thread avranno lo stesso PID ma solo se visti dall'alto. Quello che tu (come utente) chiami PID non è quello che il kernel (guardando dal basso) chiama PID.
Nel kernel, ogni thread ha il proprio ID, chiamato PID (anche se forse avrebbe più senso chiamarlo TID o ID thread) e hanno anche un TGID (thread group ID) che è il PID del thread che ha dato inizio all'intero processo.
Semplicisticamente, quando viene creato un nuovo processo , appare come un thread in cui sia il PID che il TGID hanno lo stesso (nuovo) numero.
Quando un thread avvia un altro thread, quel thread avviato ottiene il proprio PID (in modo che lo scheduler possa pianificarlo in modo indipendente) ma eredita il TGID dal thread originale.
In questo modo, il kernel può tranquillamente programmare i thread indipendentemente dal processo a cui appartengono, mentre i processi (ID del gruppo di thread) vengono segnalati all'utente.
La seguente gerarchia di thread può aiutare (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
Puoi vedere che l'avvio di un nuovo processo (a sinistra) ti dà un nuovo PID e un nuovo TGID (entrambi impostati sullo stesso valore), mentre l'avvio di un nuovo thread (a destra) ti dà un nuovo PID mantenendo lo stesso TGID come thread che lo ha avviato.
(a) Trema in soggezione per le mie impressionanti capacità grafiche :-)
getpid()
restituisce tgid:,asmlinkage long sys_getpid(void) { return current->tgid;}
come mostrato in www.makelinux.com/