나는 pthread와 세마포어를 사용하여 C에서 잠자는 이발사 문제에 대한 해결책을 구현하려고하는데, 다음과 같이 각 작업을 인쇄해야한다는 요구 사항 중 일부만 있습니다.세마포를 사용하여 잠자는 이발에서 인쇄
- 이발사가 잠 들어 떨어졌다
- 고객은 최대
- 고객이 더 좌석을 사용할 수 없어서
- 고객은 왼쪽 이발을 기다리고 이발사를 깨우지있다 을 (만 나중에 시간이 임의의 기간을 반환)
- 고객은 자신의 머리를
- 고객을 잘라지고 것은 가게
난 단지에서 순서가 인쇄 된 다양한 교착 상태 또는 가진 문을 얻기 위해, 조금이 문제에서 일했습니다 남아있다.
문제에 대한 classical solution은 여기에 완전히 적용되지 않습니다 (예 : "Barber has sleeped sleep", "customer has been barber up up") 또는 인쇄문이 매번 인쇄되기 때문에 컨텍스트 전환 (실제 문제 일 수도 있고 아닐 수도 있음)의 결과로 고장난 것입니다.
내 현재 솔루션, 의사,이 같은 것입니다 :
int chairs = N # available chairs
bool is_sleeping = false
bool is_cutting = false
bool finished = false # All customers taken care of (Changed in main)
# Semaphores for read/write access
semaphore rw_chairs = 1
semaphore rw_sleeping = 1
semaphore rw_cutting = 1
semaphore barber_ready = 0 # Barber ready to cut hair
semaphore sleeping = 0 # Barber is sleeping
semaphore cutting = 0 # Barber cutting a customer's hair
def Barber():
while not finished:
wait(rw_chairs)
wait(rw_sleeping)
# If no chairs are being used
if chairs == N:
is_sleeping = true
print("Barber is sleeping!")
signal(rw_chairs) # Allow others to read/write
signal(rw_sleeping)
wait(sleeping) # Wait for customer to wake him up
signal(barber_ready) # Allow customers into the chair
print("Barber woke up!")
else:
signal(rw_signal)
chairs += 1
signal(barber_ready)
signal(rw_chairs)
# If the barber isn't done for the day, help the customer
if not finished:
print("Helping a customer")
# Wait a random amount of time
print("Finished helping a customer")
signal(cutting) # Let the customer leave after the hair cut
else:
print("Barber is done for the day!")
def Customer():
bool helped = false
while not helped:
wait(rw_chairs)
wait(rw_cutting)
if chairs == N and not is_cutting: # If the barber is free
wait(rw_sleeping)
if is_sleeping:
signal(sleeping) # Wake the barber up
is_sleeping = false
print("Customer has woken the barber up")
signal(rw_sleeping)
is_cutting = true
signal(rw_chairs)
signal(rw_cutting)
wait(barber_ready) # Wait for the barber to be ready
wait(cutting) # Wait for him to finish cutting hair
print("Customer has had his hair cut")
helped = true
else if chairs > 0:
chairs -= 1
print("Customer is waiting in a chair")
signal(rw_chairs)
signal(rw_cutting)
wait(barber_ready)
wait(cutting)
print("Customer has had his hair cut")
helped = true
else:
signal(rw_chairs)
signal(rw_office)
print("All chairs taken, will return later")
# Wait a random amount of time
print("Customer is leaving the barbershop")
이 나는 다음과 같은 출력을 얻을 의자 3 개를 사용하여 교착 상태,하지 않는 경우 :
Barber has fallen asleep
Customer is waiting in a chair
Customer is waiting in a chair
Customer is waiting in a chair
All chairs used, will return later
All chairs used, will return later
... (repeat the above line infinitely)
그것의 명확한를 내게 이발사가 고객을 적절하게 내 보내지 못한다는 것 - 그러나 심지어 내 구조가 모두 잘못되었다고 느낀다. 내가 문제를 잘못 접근하고 있다고 생각하고 그것을 복잡하게 만들 가능성이 높습니다.
여기에있는 누군가가 현재 솔루션을 구축하는 방법에 대한 제안이나 현재의 구조 조정에 대한 제안 사항이 있으면 크게 환영 할 것입니다. 또는 내가 올바른 방향으로 가고 있다면, 아마도 올바른 방향으로 추진할 것입니다.
감사합니다.