Condition Variable

Definição

Uma Condition Variable é um mecanismo de sincronização que permite que threads aguardem até que uma determinada condição seja satisfeita, liberando temporariamente o lock associado durante a espera. Ela é usada em conjunto com um Lock ou Mutex para coordenar o acesso a recursos compartilhados de forma segura e controlada.

Diferente de um Lock, que apenas garante exclusão mútua, a Condition permite que uma thread espere até que um estado desejado seja atingido e seja notificada por outra thread.

Objetivos do uso de Condition Variables

  • Permitir que threads esperem por condições específicas de forma segura.
  • Evitar loops de verificação ativa (busy waiting).
  • Coordenar produtores e consumidores, ou outras situações com dependência de estado.
  • Garantir acesso ordenado a recursos com múltiplas etapas de sincronização.

Exemplo prático (Python)

import threading

buffer = []
cond = threading.Condition()

def produtor():
    with cond:
        print("Produtor: produzindo item...")
        buffer.append(1)
        cond.notify()  # notifica o consumidor

def consumidor():
    with cond:
        while not buffer:
            print("Consumidor: esperando item...")
            cond.wait()  # espera ser notificado
        item = buffer.pop()
        print("Consumidor: consumiu item", item)

t1 = threading.Thread(target=consumidor)
t2 = threading.Thread(target=produtor)

t1.start()
t2.start()
t1.join()
t2.join()

Saída esperada

Consumidor: esperando item...
Produtor: produzindo item...
Consumidor: consumiu item 1
  • O consumidor espera pela condição not buffer.

  • O produtor notifica que o item foi adicionado.

  • A execução continua de forma ordenada e segura.

ℹ️ Info: Após wait(), a thread deve verificar novamente a condição, pois outras threads podem ter alterado o estado antes do retorno.

O ciclo de uma Condition Variable

Thread A → adquire lock → verifica condição
          ↳ condição falsa → chama .wait() → libera lock e espera
Thread B → adquire lock → altera estado → chama .notify()
Thread A → acorda → re-adquire lock → verifica novamente

Onde é usada

  • Problemas de produtor-consumidor
  • Fila de tarefas com múltiplos consumidores
  • Threads que aguardam eventos internos ou sinais
  • Implementações manuais de barreiras e semáforos personalizados

ℹ️ Uma Condition Variable não protege os dados diretamente — ela é usada junto com locks para aguardar mudanças de estado com segurança.

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