考虑到睡眠理发师的问题,我们有以下解决方案,我们在监视器中有两个条件变量customer_available
和barber_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.signal
和barber_available.wait
吗?