Multithreading 为什么这个睡眠理发师解决方案不会导致死锁?

Multithreading 为什么这个睡眠理发师解决方案不会导致死锁?,multithreading,synchronization,Multithreading,Synchronization,考虑到睡眠理发师问题,我们有以下解决方案,其中监视器中有两个条件变量customer\u available和barber\u available: get_haircut if num_free_chairs > 0 then num_free_chairs := num_free_chairs - 1 customer_available.signal barber_available.wait do_haircut

考虑到睡眠理发师问题,我们有以下解决方案,其中监视器中有两个条件变量
customer\u available
barber\u available

get_haircut
    if num_free_chairs > 0
    then
        num_free_chairs := num_free_chairs - 1
        customer_available.signal
        barber_available.wait

do_haircut 
    if num_free_chairs = N
    then 
        customer_available.wait
    barber_available.signal
    num_free_chairs := num_free_chairs + 1
现在,假设第一位顾客进入并呼叫
customer\u available\u信号
,然后叫醒理发师;然后假设理发师线程启动并执行完整功能,并再次开始等待
customer\u available
(假设另一个线程反复调用
do\u haircut
方法)。上下文切换,然后客户线程也会阻塞导致死锁的
barber\u available
条件。因此,这个解决方案在我看来是错误的,但是在几个不同的来源中是相同的


是因为监视器中的方法是原子的,并且保证客户调用
customer\u available。信号
barber\u available。在barber线程继续执行之前按顺序等待

监视器一次只允许执行一个过程。这就是他们同步执行的方式。所以你提出的方案不会发生
get\u haircut
必须运行,直到它终止或到达可用理发师,然后才能开始
do\u haircut