2013-03-19 99 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