terça-feira, 13 de outubro 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

Validação de Dados: 11 Bibliotecas Mais Usadas
Apps e Software

Validação de Dados: 11 Bibliotecas Mais Usadas

Validar dados antes de gravar ou exibir evita retrabalho e falhas de segurança. Listamos 11 bibliotecas de validação de dados com critérios concretos para você escolher a melhor para cada linguagem e contexto.

17 de setembro de 2026 · Camila Bressane Drumond
GraphQL Subscriptions: Guia Passo a Passo Prático
Apps e Software

GraphQL Subscriptions: Guia Passo a Passo Prático

Implementar GraphQL subscriptions assusta menos do que parece. Neste guia passo a passo, mostro como configurar o servidor, escolher o pubsub certo e conectar o cliente, com os erros que eu mesmo cometi no caminho.

17 de setembro de 2026 · Letícia Sampaio Khoury
Consultar placa de carro: comprar às cegas x com dados
Apps e Software

Consultar placa de carro: comprar às cegas x com dados

Comprar carro sem checar a placa é apostar no escuro. Veja o que a tecnologia de consulta veicular mostra e como isso muda a negociação.

16 de setembro de 2026 · Redação

Gostou? Receba mais análises

Newsletter quinzenal · curadoria editorial · sem spam