Моя проблема:
Я начал изучать потоки в 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 (Не удалось указать, в каком из двух случаев это выглядит быть только на моей отладке в одиночку).