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
。