O que é uma Thread? A unidade de execução
Uma thread é a menor unidade de execução que um scheduler gerencia: uma sequência de instruções que roda dentro de um processo e compartilha a memória desse processo.
Um programa roda como um processo, e dentro desse processo uma ou mais threads realizam o trabalho. Cada thread tem seu próprio call stack e roda sua própria sequência de instruções, mas todas as threads em um processo compartilham o mesmo heap e a memória global. Essa memória compartilhada torna as threads baratas de coordenar, e também a fonte de bugs de concorrência.
O que é uma thread
Uma thread é um caminho de execução independente com seu próprio stack e program counter, vivendo dentro de um processo. O sistema operacional escalona threads nos cores da CPU, alternando entre elas para que múltiplas threads progridam.
Threads vs processos
Um processo é um programa isolado com sua própria memória; uma thread roda dentro de um processo e compartilha essa memória com threads irmãs. Threads são mais leves de criar e se comunicam mais rápido, mas um bug em uma thread pode corromper o estado compartilhado para todas elas.
O que threads compartilham e o que não
- Compartilhado: memória de heap, variáveis globais, arquivos abertos, o address space.
- Privado: o próprio call stack e os registradores de cada thread.
- O estado compartilhado é o que habilita a comunicação rápida entre threads.
- O estado compartilhado também é o que torna races e deadlocks possíveis.
O custo das threads
Threads são mais baratas que processos, mas não gratuitas: cada uma tem um stack, e o OS gasta tempo alternando entre elas. Criar milhares de threads pode esgotar a memória ou sobrecarregar o scheduler, e é por isso que muitos sistemas usam thread pools.
Um exemplo rápido
Um test runner pode usar um pool de worker threads para executar muitos arquivos de teste de uma vez, com cada worker thread puxando o próximo arquivo de uma fila compartilhada.
Threads no CI
Test runs com muitas threads podem saturar os cores e a memória de um runner pequeno, desacelerando ou atingindo OOM. Runners maiores (Latchkey) dão às threads cores reais para rodar, e OOM kills transitórios de picos de thread ou memória podem ter retry automático.
Principais conclusões
- Uma thread é a menor unidade escalonável de execução, rodando dentro de um processo.
- Threads compartilham heap e globais, mas cada uma tem seu próprio stack.
- A memória compartilhada torna threads rápidas de coordenar, mas habilita races e deadlocks.