Os quatro threads terão o mesmo PID, mas apenas quando vistos de cima. O que você (como usuário) chama de PID não é o que o kernel (olhando de baixo) chama de PID.
No kernel, cada thread tem seu próprio ID, chamado de PID (embora possivelmente faça mais sentido chamá-lo de TID ou ID de thread) e eles também têm um TGID (ID de grupo de thread) que é o PID do thread que iniciou todo o processo.
De forma simplista, quando um novo processo é criado, ele aparece como uma thread em que o PID e o TGID são o mesmo (novo) número.
Quando um encadeamento inicia outro encadeamento, esse encadeamento iniciado obtém seu próprio PID (para que o planejador possa agendá-lo independentemente), mas herda o TGID do encadeamento original.
Dessa forma, o kernel pode agendar threads alegremente independentemente de qual processo eles pertencem, enquanto os processos (IDs de grupo de threads) são relatados a você.
A seguinte hierarquia de threads pode ajudar (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
Você pode ver que iniciar um novo processo (à esquerda) fornece um novo PID e um novo TGID (ambos definidos com o mesmo valor), enquanto iniciar um novo thread (à direita) fornece um novo PID, mantendo o mesmo TGID como o tópico que o iniciou.
(a) Tremer de admiração com minhas impressionantes habilidades gráficas :-)
getpid()
retorna tgid:,asmlinkage long sys_getpid(void) { return current->tgid;}
conforme mostrado em www.makelinux.com/