A documentação pode ser bastante confusa, então aqui está o modelo Linux " real ":
- dentro do kernel do Linux, algo que pode ser executado (e agendado) é chamado de "processo",
- cada processo possui um ID do processo (PID) exclusivo do sistema e um TGID (Thread Group ID),
- um processo "normal" possui PID = TGID e nenhum outro processo compartilha esse valor de TGID,
- um processo "encadeado" é um processo cujo valor TGID é compartilhado por outros processos,
- vários processos que compartilham o mesmo TGID também compartilham, pelo menos, o mesmo espaço de memória e manipuladores de sinal (às vezes mais),
- se um processo "encadeado" tiver PID = TGID, ele poderá ser chamado "o encadeamento principal",
- a chamada
getpid()de qualquer processo retornará seu TGID (= "main thread" PID),
- a chamada
gettid()de qualquer processo retornará seu PID (!),
- qualquer tipo de processo pode ser criado com a
clone(2)chamada do sistema,
- nomes numéricos das pastas com os quais você pode listar,
ls /proccomo /proc/NUMBERsão TGIDs,
- nomes numéricos das pastas, assim
/proc/TGID/taskcomo /proc/TGID/task/NUMBERos PIDs,
- mesmo que você não veja todos os PIDs existentes
ls /proc, ainda é possível cd /proc/any_PID.
Conclusão : do ponto de vista do kernel, existem apenas processos, cada um com seu próprio PID exclusivo, e o chamado thread é apenas um tipo diferente de processo.
Nota: a implementação do conceito de "thread" no Linux levou a uma confusão de vocabulário e, se getpid() mentir para você , não faz o que você pensava, é porque seu comportamento segue a compatibilidade com POSIX (os threads devem compartilhar um PID comum) .