import threading
# Definir um recurso compartilhado
contador = 0
# Definir um bloqueio de exclusão mútua
lock = threading.Lock()
# Função para incrementar o contador usando primitivas bloqueantes
def incrementar_bloqueante():
global contador
# Adquirir o bloqueio
lock.acquire()
try:
# Incrementar o contador
contador += 1
# Simular uma operação de E/S
finally:
# Liberar o bloqueio
lock.release()
# Função para incrementar o contador usando primitivas não bloqueantes
def incrementar_nao_bloqueante():
global contador
# Tentar adquirir o bloqueio sem bloquear
if lock.acquire(blocking=False):
try:
# Incrementar o contador
contador += 1
# Simular uma operação de E/S
finally:
# Liberar o bloqueio
lock.release()
else:
# Se o bloqueio não estiver disponível, imprimir uma mensagem
print("Bloqueio não disponível. Não foi possível incrementar o contador.")
# Criar threads para executar as funções
thread_bloqueante = threading.Thread(target=incrementar_bloqueante)
thread_nao_bloqueante = threading.Thread(target=incrementar_nao_bloqueante)
#extra
thread_bloqueante2 = threading.Thread(target=incrementar_bloqueante)
# Iniciar as threads
thread_bloqueante.start()
thread_nao_bloqueante.start()
#extra
thread_bloqueante2.start()
# Esperar até que as threads terminem
thread_bloqueante.join()
#thread_nao_bloqueante.join()
#extra
#thread_bloqueante2.join()
# Imprimir o valor final do contador
print(f"Valor final do contador: {contador}")