Programação concorrente

Threads, corridas, secções críticas, atomics, mutexes, semáforos e condições.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Threads

  • Partilham endereço e descritores; cada uma tem registos, PC e pilha. Pilha não é privacidade: um apontador válido partilha o objeto.
  • pthread_create recebe void *f(void *). Dá a cada thread a sua estrutura, viva e estável até aos joins; a variável do ciclo não serve.
  • pthread_join recolhe o retorno: bloco com dono ou objeto ainda vivo, nunca pilha da thread.
  • pthread_exit termina a thread; exit ou return de main terminam o processo.
  • Acessos concorrentes incompatíveis sem sincronização são data race: comportamento indefinido. volatile não resolve.

Exclusão e ordem

Solução clássica: exclusão mútua, progresso e espera limitada. Exclusão sozinha não dá justiça.

PrimitivaIdeia
Mutexprotege a operação indivisível; granularidade segue os dados
Test-and-set / CASescrita atómica para construir locks
Spinlockespera ativa; só para trechos curtos
Semáforowait consome, post liberta; conta ou ordena
Condicionalespera por predicado sob mutex
  • Fila limitada NN: vazios=N, cheios=0; espera disponibilidade antes do mutex, anuncia depois de a largar.
  • Peterson exige atomicidade e ordem de memória; globais C comuns não chegam. Desligar interrupções numa CPU não trava as outras.
  • Pthreads devolve o erro diretamente; não leias errno.

Condição: while, sempre

pthread_cond_wait liberta o mutex e dorme atomicamente; ao voltar, reobteve-o. O sinal não reserva itens nem entrega o mutex.

pthread_mutex_lock(&mutex);
while (quantidade == 0)
    pthread_cond_wait(&nao_vazio, &mutex);
int valor = buffer[saida];
saida = (saida + 1) % CAPACIDADE;
quantidade--;
pthread_cond_signal(&nao_cheio);
pthread_mutex_unlock(&mutex);
  • Reavalia com while: há despertares espúrios e outro consumidor pode levar o item.
  • Produtor: espera enquanto cheio, insere, sinaliza. Fim com vários consumidores: flag sob o mesmo mutex e broadcast.
  • Hoare entrega o monitor a quem espera; Mesa (Pthreads) deixa o sinalizador continuar e exige reavaliação.
  • Leitores/escritores: vários leitores ou um escritor. Preferência contínua por um lado deixa o outro em inanição.

Consumidor completo.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.