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

そして、そのエラーを与える

4

1 に答える 1

0

コードを見ると、ロックの 1 つを 2 回解放しているように見えます。最初に left_fork ロックを取得します。

forks[self.left_fork].acquire()

そして後でそれを解放します:

forks[self.left_fork].release()

次に、フォーク リストで 2 つのロックを切り替えると、解放されたロックが次のようになり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失敗したかどうかを確認し、 release を解放することでした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
于 2013-03-19T02:37:59.133 に答える