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

查看您的代码,您似乎两次释放其中一个锁。首先,您获取 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
于 2013-03-19T02:37:59.133 回答