Я пытаюсь реализовать простой код 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 из них успешно завершатся, и, скорее всего, возникнет тупик.