为什么这种睡眠理发解决方案不会造成死锁?

时间:2014-11-01 14:31:15

标签: multithreading synchronization

考虑到睡眠理发师的问题,我们有以下解决方案,我们在监视器中有两个条件变量customer_availablebarber_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_available_signal并唤醒理发师;然后假设理发师线程启动并执行完整的函数并再次开始等待customer_available(假设另一个线程一次又一次地调用do_haircut方法)。并且上下文切换然后客户线程也卡在barber_available条件导致死锁。所以,这个解决方案对我来说似乎不对,但是它在几个不同的来源中是相同的。

是因为监视器中的方法是原子的,并且客户可以保证在理发线程继续执行之前依次调用customer_available.signalbarber_available.wait吗?

0 个答案:

没有答案