Barreira (Barrier)
Definição
Barreira (Barrier) é um mecanismo de sincronização que bloqueia múltiplas threads até que todas cheguem a um ponto específico da execução, e só então as libera simultaneamente.
É útil para dividir algoritmos concorrentes em etapas coordenadas, onde todas as threads devem esperar umas pelas outras antes de avançar.
Uma vez que todas as threads tenham “alcançado a barreira”, o ciclo se reinicia — por isso barreiras são ideais em algoritmos divididos em fases (como simulações, computações distribuídas ou algoritmos paralelos por etapas).
Objetivos do uso de Barreira
- Sincronizar múltiplas threads em pontos comuns do código.
- Dividir a execução em fases em que todas as threads devem aguardar antes de continuar.
- Evitar corrida descoordenada entre tarefas paralelas.
- Facilitar controle de fluxos paralelos dependentes entre si.
Exemplo prático (Python)
import threading
import time
# Define a barreira que espera 3 threads
barreira = threading.Barrier(3)
def tarefa(id):
print(f"Thread {id} iniciou etapa 1")
time.sleep(1)
print(f"Thread {id} aguardando barreira")
barreira.wait()
print(f"Thread {id} avançou para etapa 2")
threads = [threading.Thread(target=tarefa, args=(i,)) for i in range(3)]
for t in threads:
t.start()
for t in threads:
t.join()
Saída esperada
Thread 0 iniciou etapa 1
Thread 1 iniciou etapa 1
Thread 2 iniciou etapa 1
Thread 0 aguardando barreira
Thread 1 aguardando barreira
Thread 2 aguardando barreira
Thread 2 avançou para etapa 2
Thread 0 avançou para etapa 2
Thread 1 avançou para etapa 2
Todas as threads esperam umas pelas outras antes de continuar.
O ciclo de sincronização com barreira
Thread A → executa etapa 1 → espera na barreira
Thread B → executa etapa 1 → espera na barreira
Thread C → executa etapa 1 → espera na barreira
[Barreira liberada] → todas avançam para etapa 2
A barreira só libera as threads quando todas chegarem ao ponto de espera (
barreira.wait()
).Após a liberação, a barreira pode ser reutilizada em um próximo ciclo.
Considerações
Barreira é útil para algoritmos em fases sincronizadas (como simulações físicas, jogos, engines paralelas).
Se alguma thread falhar ou não atingir a barreira, o programa pode travar — por isso, barreiras devem ser usadas com garantia de chegada de todas as threads.
⚠️ Use com cuidado: a ausência de uma thread pode levar a bloqueios indefinidos.