哲学家就餐死锁问题的Python实现
我正在实现哲学家就餐问题,但我遇到了一个错误,错误信息是
# Pick up the forks
forks[self.left_fork].acquire()
locked = forks[self.right_fork].acquire(False)
if locked == True:
break
forks[self.left_fork].release()
forks[self.left_fork], forks[self.right_fork] = forks[self.right_fo\
rk], forks[self.left_fork]
# Put down the forks
forks[self.right_fork].release()
forks[self.left_fork].release()
它打印出这个内容
1 is eating
2 is eating
3 is eating
然后出现了那个错误
1 个回答
0
从你的代码来看,你似乎把一个锁释放了两次。首先,你获取了左叉子的锁:
forks[self.left_fork].acquire()
然后你又释放了它:
forks[self.left_fork].release()
接着你在叉子的列表中交换了两个锁的位置,所以被释放的锁现在在 fork[self.right_fork]
里:
forks[self.left_fork], forks[self.right_fork] = forks[self.right_fork], forks[self.left_fork]
在休眠之后,你又释放了锁:
forks[self.right_fork].release()
forks[self.left_fork].release()
这就导致了错误。从代码来看,第一条 release()
调用可能是错误的。
看起来你的本意是检查获取 right_fork
的锁是否失败,如果失败就释放 left_fork
,这应该像这样:
# Pick up the forks
forks[self.left_fork].acquire()
locked = forks[self.right_fork].acquire(False)
if not locked:
forks[self.left_fork].release()
break