python中的死锁
我正在解决这个问题,但是我得到一个错误python中的死锁,python,Python,我正在解决这个问题,但是我得到一个错误 # Pick up the forks forks[self.left_fork].acquire() locked = forks[self.right_fork].acquire(False) if locked == True:
# 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
然后给出该错误查看代码,您似乎要释放其中一个锁两次。首先,您获得左_叉锁:
forks[self.left_fork].acquire()
然后发布:
forks[self.left_fork].release()
然后在forks列表中切换这两个锁,因此释放的锁现在位于fork[self.right\u 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()
调用可能是不正确的
其目的大概是检查锁定右叉
的尝试是否失败,然后释放左叉
,看起来应该是这样的:
# 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
您希望它打印什么?我不希望它冻结并出现错误,在给定的时间内,所有5个都应该正常运行?如果两个锁都被获取,那么破坏又有什么关系?这似乎没有道理->一旦一个哲学家抓住两个叉子(锁),这两个叉子就再也不能使用了。我试图实现注意,在这个例子中有两个循环:一个在
run
中,它调用dine
,以及dine
中的一个,其中包含尝试拾取叉子的代码。如果该解决方案对您有效,我建议您使用该解决方案,并在您更好地理解该算法之前避免创建自己的解决方案。但是,这会让0,2,4人受益,这是为什么?您可能会在交换锁时遇到问题(我不记得在我学习时这是问题的一部分)。此外,这种避免死锁的解决方案并不能保证任何个人都能同时获得这两个分叉。