fork download
  1. import threading
  2. import time
  3.  
  4. # Definir um recurso compartilhado
  5. contador = 0
  6.  
  7. # Definir um bloqueio de exclusão mútua
  8. lock = threading.Lock()
  9.  
  10. # Função para incrementar o contador usando primitivas bloqueantes
  11. def incrementar_bloqueante():
  12. global contador
  13. # Adquirir o bloqueio
  14. lock.acquire()
  15. try:
  16. # Incrementar o contador
  17. contador += 1
  18. # Simular uma operação de E/S
  19. time.sleep(1)
  20. finally:
  21. # Liberar o bloqueio
  22. lock.release()
  23.  
  24.  
  25. # Função para incrementar o contador usando primitivas não bloqueantes
  26. def incrementar_nao_bloqueante():
  27. global contador
  28. # Tentar adquirir o bloqueio sem bloquear
  29. if lock.acquire(blocking=False):
  30. try:
  31. # Incrementar o contador
  32. contador += 1
  33. # Simular uma operação de E/S
  34. time.sleep(1)
  35. finally:
  36. # Liberar o bloqueio
  37. lock.release()
  38. else:
  39. # Se o bloqueio não estiver disponível, imprimir uma mensagem
  40. print("Bloqueio não disponível. Não foi possível incrementar o contador.")
  41.  
  42.  
  43.  
  44. # Criar threads para executar as funções
  45. thread_bloqueante = threading.Thread(target=incrementar_bloqueante)
  46. thread_nao_bloqueante = threading.Thread(target=incrementar_nao_bloqueante)
  47. #extra
  48. thread_bloqueante2 = threading.Thread(target=incrementar_bloqueante)
  49.  
  50. # Iniciar as threads
  51. thread_bloqueante.start()
  52. thread_nao_bloqueante.start()
  53. #extra
  54. thread_bloqueante2.start()
  55.  
  56. # Esperar até que as threads terminem
  57. thread_bloqueante.join()
  58. #thread_nao_bloqueante.join()
  59. #extra
  60. #thread_bloqueante2.join()
  61.  
  62. # Imprimir o valor final do contador
  63. print(f"Valor final do contador: {contador}")
  64.  
Success #stdin #stdout 0.04s 10272KB
stdin
Standard input is empty
stdout
Bloqueio não disponível. Não foi possível incrementar o contador.
Valor final do contador: 2