Документація може бути досить заплутаною, тому ось " справжня " модель Linux:
- всередині ядра Linux те, що можна запустити (і запланувати), називається "процесом",
- кожен процес має унікальний ідентифікатор процесу (PID) та ідентифікатор групи ниток (TGID),
- "нормальний" процес має PID = TGID, і жоден інший процес не поділяє це значення TGID,
- "потоковий" процес - це процес, значення якого TGID поділяється іншими процесами,
- кілька процесів спільного використання одного і того ж TGID також діляться, принаймні, тим самим простором пам'яті та обробниками сигналів (іноді більше),
- якщо "потоковий" процес має PID = TGID, його можна назвати "основним потоком",
- дзвінок
getpid() з будь-якого процесу поверне свій TGID (= "PID основного потоку"),
- дзвінок
gettid() з будь-якого процесу поверне PID (!),
- будь-який процес може бути створений за допомогою
clone(2)системного виклику,
- числові імена папок, з якими ви можете перелічити,
ls /procяк /proc/NUMBERTGID,
- числові імена папок,
/proc/TGID/taskяк /proc/TGID/task/NUMBERі PID,
- незважаючи на те, що ви не бачите всіх існуючих PID
ls /proc, ви все одно можете це зробити cd /proc/any_PID.
Висновок : з точки зору ядра, існують лише процеси, кожен з яких має свій унікальний PID, а так званий потік - це просто різного роду процес.
Примітка: реалізація концепції "потоку" в Linux призвела до плутанини лексики, і якщо getpid() брехня вам не робить те, що ви думали, це тому, що її поведінка відповідає сумісності POSIX (потоки повинні мати спільний PID) .