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 tem um ID de processo (PID) exclusivo do sistema e um ID de grupo de threads (TGID),
- um processo "normal" tem PID = TGID e nenhum outro processo compartilha esse valor de TGID,
- um processo "encadeado" é um processo cujo valor de TGID é compartilhado por outros processos,
- vários processos compartilhando o mesmo TGID também compartilham, pelo menos, o mesmo espaço de memória e manipuladores de sinais (às vezes mais),
- se um processo "encadeado" tiver PID = TGID, ele pode ser chamado de "o encadeamento principal",
- chamar
getpid()
de qualquer processo retornará seu TGID (= "thread principal" PID),
- chamar
gettid()
de qualquer processo retornará seu PID (!),
- qualquer tipo de processo pode ser criado com a chamada do sistema
clone(2)
,
- nomes numéricos das pastas que você pode listar com
ls /proc
como /proc/NUMBER
são TGIDs,
- nomes numéricos das pastas em
/proc/TGID/task
como /proc/TGID/task/NUMBER
são PIDs
- mesmo que você não veja todos os PIDs existentes com
ls /proc
, ainda é possível fazer cd /proc/any_PID
.
Conclusão : do ponto de vista do kernel, existem apenas processos, cada um com seu próprio PID, e um chamado thread é apenas um tipo diferente de processo.
Nota: a implementação do conceito "thread" no Linux levou a uma confusão de vocabulário, e se getpid()
está mentindo para você não faz o que você pensamento, é porque o seu comportamento segue a compatibilidade POSIX (threads devem compartilhar um PID comum).