quarta-feira, 16 de setembro de 2026 · Edição online
Digitorack
Digitorack

Race conditions em programação: o que são e como evitar

ResumoRace conditions em programação concorrente ocorrem quando duas ou mais threads acessam e modificam um recurso compartilhado sem sincronização adequada, gerando resultados imprevisíveis. A identificação exige análise de interleavings possíveis e reprodução com ferramentas de stress test. Prevenção utiliza mutexes, semáforos, operações atômicas ou estruturas lock-free, garantindo exclusão mútua e visibilidade de memória.

Race conditions acontecem quando duas threads disputam o mesmo recurso. Veja como identificar, reproduzir e evitar esse bug clássico de programação concorrente.

Letícia Sampaio Khoury Letícia Sampaio Khoury · Editora de Gadgets e Consumo Tech
· · 5 min de leitura
Race conditions em programação: o que são e como evitar
Foto: Imagem ilustrativa · Digitorack

Race conditions acontecem quando duas threads disputam o mesmo recurso. Veja como identificar, reproduzir e evitar esse bug clássico de programação concorrente.

O que são race conditions em programação?

Race condition, ou condição de corrida, é um bug clássico de programação concorrente. Ele acontece quando duas ou mais threads (ou processos) acessam o mesmo recurso compartilhado, como uma variável, um arquivo ou uma conexão de banco, e pelo menos uma delas tenta modificar esse recurso. O resultado final depende da ordem em que as threads executam, e essa ordem é imprevisível.

Na prática, você tem um código que funciona na sua máquina, passa nos testes locais, mas falha de vez em quando em produção. São bugs intermitentes, difíceis de reproduzir, que costumam aparecer sob carga alta. O exemplo mais didático é o contador compartilhado: duas threads executam contador++ ao mesmo tempo, e o valor final pode ser menor do que o esperado, porque a operação de leitura e escrita não é atômica.

Eu já perdi horas debugando um sistema de filas que perdia mensagens esporadicamente. O código parecia correto, mas duas threads atualizavam o mesmo índice sem trava. Foi só quando coloquei um lock que o problema sumiu. A especificação impressiona, o uso decide: em concorrência, o diabo mora na sincronização.

Por que race conditions são difíceis de identificar?

O principal motivo é a não determinismo. O bug só aparece quando as threads se intercalam em um ponto crítico, o que depende do scheduler do sistema operacional, da velocidade da CPU, da carga da máquina. Em testes unitários, quase nunca acontece, porque a execução é sequencial.

Outro fator é que o código pode funcionar por meses e falhar uma única vez. Isso faz o desenvolvedor desconfiar de tudo, menos do próprio código. Ferramentas de análise estática e sanitizadores de corrida, como o ThreadSanitizer, ajudam a detectar, mas exigem que o teste realmente exercite o cenário concorrente.

Como evitar race conditions: estratégias práticas

A forma mais direta de evitar é usar exclusão mútua. Um mutex (ou lock) garante que apenas uma thread acesse o recurso por vez. Em Java, você usa synchronized ou ReentrantLock; em Python, threading.Lock; em Go, sync.Mutex. O custo é performance, mas a segurança vem primeiro.

Outra abordagem é usar operações atômicas. Em vez de contador++, use AtomicInteger.incrementAndGet() no Java ou atomic no C++. Isso elimina a janela de corrida sem precisar de lock.

Também vale considerar estruturas de dados thread-safe, como ConcurrentHashMap ou queue.Queue, que já tratam a sincronização internamente. E, em alguns casos, a melhor solução é evitar o estado compartilhado: cada thread trabalha com sua cópia e o resultado é combinado no final.

Pergunte se resolve sua vida antes de comprar: às vezes, o problema pode ser redesenhado para não precisar de concorrência no ponto crítico.

O que é uma seção crítica?

Seção crítica é o trecho de código que acessa o recurso compartilhado. É justamente onde a race condition pode ocorrer. A ideia é proteger essa seção com um mecanismo de sincronização, garantindo que apenas uma thread a execute por vez.

O tamanho da seção crítica importa: quanto menor, melhor. Se você colocar um lock em um bloco enorme, vai serializar tudo e matar a performance. O ideal é proteger apenas as poucas linhas que realmente precisam de exclusão mútua.

Exemplo prático de race condition em código

Considere este trecho em Python:

contador = 0

def incrementar(): global contador valor = contador valor += 1 contador = valor

Se duas threads chamarem incrementar() ao mesmo tempo, ambas podem ler contador = 0, calcular 1 e gravar 1. O resultado final é 1, mas deveria ser 2. A solução é usar um lock:

from threading import Lock

lock = Lock() contador = 0

def incrementar(): global contador with lock: contador += 1

Resumo

Race conditions são bugs de concorrência que dependem da ordem de execução das threads. Elas causam falhas intermitentes e difíceis de reproduzir. Para evitar, use locks, operações atômicas ou estruturas thread-safe, e mantenha as seções críticas pequenas. Se o problema persistir, repense o design para reduzir o estado compartilhado.

Perguntas frequentes sobre race conditions

Race condition é um bug ou uma vulnerabilidade?

Pode ser os dois. Como bug, causa comportamento incorreto. Como vulnerabilidade, é explorada em ataques de segurança, como o "time-of-check to time-of-use" (TOCTOU), onde um atacante altera o recurso entre a verificação e o uso. Em sistemas críticos, isso pode levar a escalonamento de privilégios ou acesso indevido.

Qual a diferença entre race condition e deadlock?

Race condition é um resultado incorreto por falta de sincronização. Deadlock é quando duas ou mais threads ficam esperando uma pela outra, travando o sistema. Enquanto a race condition gera saída errada, o deadlock gera parada total. As soluções também diferem: locks previnem race, mas podem causar deadlock se mal usados.

Como reproduzir uma race condition?

É difícil, mas dá para aumentar a chance com loops de execução concorrente, usando muitos threads e acessos repetidos ao mesmo recurso. Ferramentas como ThreadSanitizer, Helgrind e o detector de corrida do Go ajudam a identificar o ponto exato. Em testes, use barreiras para forçar a intercalação das threads.

Race condition só acontece com threads?

Não. Pode ocorrer entre processos, entre corrotinas, ou até entre código síncrono e callbacks assíncronos. Qualquer ambiente com execução concorrente ou paralela está sujeito. Até mesmo sistemas distribuídos têm race conditions, quando dois nós acessam o mesmo dado sem coordenação.

Vale a pena usar sempre locks?

Depende. Locks resolvem, mas custam performance e podem causar deadlock. Se a operação for simples, prefira operações atômicas. Se for uma leitura frequente e escrita rara, use read-write locks. O ideal é medir o impacto e escolher a solução mais simples que elimine a corrida sem travar o sistema.

Compartilhar:
Letícia Sampaio Khoury

Letícia Sampaio Khoury

Editora de Gadgets e Consumo Tech

Testa o gadget no dia a dia real, avalia se vale a grana sem deslumbre de novidade.

Ver todos os artigos →

Leia também

Blue Green Deployment: o que é e como fazer
Apps e Software

Blue Green Deployment: o que é e como fazer

Blue green deployment é um modelo de release que mantém dois ambientes idênticos e troca o tráfego de um para o outro. O ganho é rollback quase instantâneo; o preço é manter infraestrutura duplicada.

16 de setembro de 2026 · Letícia Sampaio Khoury
OpenTelemetry observabilidade: guia de configuração
Apps e Software

OpenTelemetry observabilidade: guia de configuração

Configurar OpenTelemetry para observabilidade exige decidir o que instrumentar, subir um coletor e exportar dados para um backend. Neste guia mostro o caminho que uso em projetos reais, com os erros que aparecem no meio.

16 de setembro de 2026 · Letícia Sampaio Khoury
Helm vs Kustomize: qual gerenciador Kubernetes escolher
Apps e Software

Helm vs Kustomize: qual gerenciador Kubernetes escolher

Helm e Kustomize resolvem problemas diferentes no mesmo cluster. Um empacota e versiona; o outro adapta YAML nativo sem template. Veja em qual cenário cada abordagem encaixa melhor para o seu time.

16 de setembro de 2026 · Letícia Sampaio Khoury

Gostou? Receba mais análises

Newsletter quinzenal · curadoria editorial · sem spam