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.

Relacionados

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com