哲学家在python中用餐僵局

时间:2013-03-19 01:46:14

标签: python

我正在实施哲学家用餐问题,但是我收到错误

            # 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

然后给出错误

1 个答案:

答案 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