2013-03-19 94 views
0

就餐的僵局,我实现哲学家就餐问题,但是我得到的哲学家蟒蛇

  # 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

什么是你期待它打印? – enginefree 2013-03-19 01:48:03

+0

我不指望它会冻结并出现错误,并且在给定的时间内,所有5个应该正确地吃东西? – 2013-03-19 01:50:20

+0

如果两个锁都被收购,破产的处理是什么?这似乎没有道理 - >一旦一位哲学家抓住两把叉子(锁),那两把叉就永远无法再被使用。 – Moshe 2013-03-19 01:56:02

回答

0

看着一个错误的代码,你似乎会释放两次锁之一。首先,你获得left_fork锁:

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 
+0

然而,这给了0,2,4人,为什么? – 2013-03-19 16:08:56

+0

您可能会遇到交换锁的问题(我不记得在我学习时遇到问题的一部分)。而且,这种避免死锁的解决方案并不能保证任何人都能得到这两个分支。 – 2013-03-20 06:04:58