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.