我正在研究昏昏欲睡的理发师问题中的信号量值。我正在想象一个场景,其中有一个客户已经在理发店里,然后有4个其他客户进入理发店。候诊室可容纳三个座位。我想知道这种情况下理发师已被占用的信号量值。
[我知道,当理发店开张时顾客第一次来时,我最终得到了这些信号量值:
barber = 0
customer = 0
mutex = 1
这是我针对此问题的伪代码:
/* Counting semaphores - the integer value represents the initial count for the semaphores */
Semaphore customer = 0; /* Number of customer waiting for service */
Semaphore barber = 0; /* Number of barber waiting for students */
Semaphore mutex = 1; /* Mutual exclusion when accessing the waiting room */
int waiting = 0; /* Students waiting for turn with professor */
Barber() {
while (TRUE) {
wait (customer); /* Go to sleep if no customers */
wait (mutex); /* Get access to waiting room */
waiting--; /* Decrement number of waiting customers */
signal (barber); /* Barber is ready */
signal (mutex); /* Releasing waiting room */
#GiveHaircut;
}
}
Customer() {
wait (mutex); /* Enter critical section, which is the waiting room */
if (waiting < 3) { /* If there are free chairs in the waiting room */
waiting++;
signal (customer); /* Wake up barber if necessary */
signal (mutex); /* Release access to count of waiting customers */
wait (barber); /* Wait for barber if not available */
#GetHaircut;
} else {
signal (mutex); /* Waiting area is full, leave without waiting */
}
}
[当我尝试跟踪此代码并且理发师已被占用时,我一直在获取barber = -1
。
我不确定这是否可以作为一个值,只是感到非常困惑,如果有人可以在这种情况下帮助我跟踪伪代码以找到信号量值,我将不胜感激。我只看到有客户进来的示例,但没有其他在线案例。谢谢。
我不确定您的场景中是否有一个或多个理发师,所以我会为您提供两种情况的简短伪代码草稿。在这两种情况下,我们都假设您有一个3座位的候诊室-这意味着您的信号量最大为3,当顾客进来时他们等待一个免费地点,轮到他们理发时,他们会发出信号现在有一个空位。对于席位“资源”,我们将有一个名为seatAvailable的信号灯。理发师唯一的“担心”是他有客户,因此我们将为他介绍一个名为customersAvailable的信号灯。
因此,当您只有一个理发师时,所有客户都在使用与单个理发师相同的“资源”-因此,您需要互斥量信号灯,我们将其称为barberMutex。
一个理发师场景
Semaphore barberMutex = 1
Semaphore customersAvailable = 0
Semaphore seatsAvailable = 3
Barber:
wait(customersAvailable) // wait for customers to show up
# doHaircut...
signal(barberMutex) // after one customer has been served, barber is free
Customer:
wait(seatsAvailable) // wait for an available seat
signal(customersAvailable) // once you've sat signal to you barber that there's customers waiting
wait(barberMutex) // wait if the barber is not free
signal(seatsAvailable) // once it's your turn, you go to barber and there is an open seat
# getHaircut
多个理发师场景在这种情况下,我们有多个理发师,因此我们将没有互斥锁,而是一个信号量,其值为val,其中n是该商店中工作的理发师的数量(在我们的示例中,假设为3,并将其称为信号量barbersAvailable)。
Semaphore barbersAvailable = 3
Semaphore customersAvailable = 0
Semaphore seatsAvailable = 3
Barber:
wait(customersAvailable)
#doHaircut
*signal(barbersAvailable)*
Customer:
wait(seatsAvailable) // wait for an available seat
signal(customersAvailable) // once you've sat signal to you barber that there's customers waiting
*wait(barberAvailable)* // wait for one of the barbers to be free
signal(seatsAvailable) // once it's your turn, you go to barber and there is an open seat
# getHaircut
我一直假设wait忙于等待该资源,在获得资源后,它会降低该信号灯的val,同时signal也会增加该信号灯的val。