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