我正在实施哲学家用餐问题,但是我收到错误
# 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
然后给出错误
答案 0 :(得分:0)
查看代码,您似乎两次释放其中一个锁。首先你获得了left_fork锁:
forks[self.left_fork].acquire()
后来发布了它:
forks[self.left_fork].release()
然后在您的forks列表中切换两个锁定,因此释放的锁定现在位于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