Python 3.x Threading: «RuntimeError: снять разблокированную блокировку» в проблеме Sleeping Barber - PullRequest
0 голосов
/ 23 апреля 2020

Моя проблема:

Я начал изучать потоки в Python, поэтому я решил попытаться реализовать «проблему спящего парикмахера», зная только логику c позади однако, я столкнулся с проблемой: если используется большее количество потоков и / или слишком короткое время time.sleep() (я использую его для целей отладки), я в конечном итоге получу RuntimeError: release unlocked lock, поскольку он пытается освободить мою блокировку customer_ready (cliente_pronto в моем коде), когда она уже была освобождена, то, что из того, что я понял (и, возможно, я ошибаюсь), не должно произойти.

Что может быть, что мне здесь не хватает?

Мой код:

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
  global barbeiro_pronto
  global wr_acessivel
  global cliente_pronto

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

def cliente():
  global num_assentos_livres
  global barbeiro_pronto
  global wr_acessivel
  global cliente_pronto

  while (True):
    wr_acessivel.acquire()
    if num_assentos_livres > 0:
      num_assentos_livres-=1
      cliente_pronto.release()
      wr_acessivel.release()
      barbeiro_pronto.acquire()
      return
    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

Что я пробовал:

Попытка поставить if cliente_pronto.locked(): перед снятием такой блокировки, однако это приводит к проблеме, что все мои потоки, выполняющие функцию cliente, либо возвращаются, не выполнив весь свой код, либо входят в тупик вместе с моим barbeiro function (Не удалось указать, в каком из двух случаев это выглядит быть только на моей отладке в одиночку).

...