Потенциальные взаимоблокировки в проблеме Sleeping Barber в потоке Python 3.x - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь реализовать простой код Sleeping Barber в Python, в котором переменная num_assentos_livres представляет собой число, представляющее число «свободных мест в комнате ожидания» в моем коде. Логика c проста: если моя функция cliente прошла успешно, я ломаю l oop, иначе l oop продолжается. Однако есть проблема: Никогда все мои потоки, выполняющие функцию cliente, не завершаются успешно.

Если у меня больше потоков, чем num_assentos_livres, только (2 + количество потоков - num_assentos_livres) успешно завершиться. Если у меня есть и равно или больше или равно num_assentos_livres, чем мое количество потоков, только 2 потока заканчиваются успешно, что заставило меня подумать, что где-то в моем коде может произойти тупик. Однако, несмотря на отладку, я не смог его найти.

Что бы это могло быть?

import threading

barbeiro_pronto = threading.Lock()
wr_acessivel = threading.Lock()
cliente_pronto = threading.Lock()
num_assentos_livres = 10
clientes = []

barbeiro_pronto.acquire()
cliente_pronto.acquire() 

def barbeiro():
  global num_assentos_livres

  while (True):
    cliente_pronto.acquire()
    wr_acessivel.acquire()
    num_assentos_livres+=1
    barbeiro_pronto.release()
    wr_acessivel.release()

def cliente():
  global num_assentos_livres
  recebeu_corte = False

  while (not recebeu_corte):
    wr_acessivel.acquire()
    if num_assentos_livres > 0:
      num_assentos_livres-=1
      if cliente_pronto.locked():
        cliente_pronto.release()
      wr_acessivel.release()
      barbeiro_pronto.acquire()
      cortados +=1
      recebeu_corte = True
    else:
      wr_acessivel.release()

thread_barbeiro = threading.Thread(target=barbeiro)
thread_barbeiro.start()

for i in range(15):
  thread_cliente = threading.Thread(target=cliente)
  thread_cliente.start()
  clientes.append(thread_cliente)

while (True):
  pass

В этом примере, где я использую значение от 10 до num_assentos_livres и 15 потоков, только 7 из них успешно завершатся, и, скорее всего, возникнет тупик.

...