Четыре потока будут иметь одинаковый PID, но только при просмотре из выше. То, что вы (как пользователь) называет PID, не то, что ядро (смотрит снизу) вызывает PID.
В ядре , каждый поток имеет свой собственный идентификатор, называемый PID (хотя, возможно, было бы более целесообразно называть это TID или идентификатором потока), и у них также есть TGID (группа потоков ID), который является PID потока, запустившего весь процесс.
Упрощенно, когда создается новый процесс , он выглядит как поток, в котором PID и TGID имеют одно и то же (новое) число.
Когда поток запускает другой поток , , который запустил поток, получает свой собственный PID (так что планировщик может планировать его независимо), но он наследует TGID из исходного потока.
Таким образом, ядро может планировать потоки независимо от того, к какому процессу они принадлежат, в то время как процессы (идентификаторы группы потоков) сообщаются вам.
Может помочь следующая иерархия потоков (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
Вы можете видеть, что запуск нового процесса (слева) дает вам новый PID и новый TGID (оба установлены на одно и то же значение) при запуске нового thread (справа) дает вам новый PID, сохраняя тот же TGID, что и поток, который его запустил.
(a) Трепет от страха от моих впечатляющих графических навыков: -)