哲学家就餐死锁问题的Python实现

0 投票
1 回答
1654 浏览
提问于 2025-04-17 19:35

我正在实现哲学家就餐问题,但我遇到了一个错误,错误信息是

            # 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

从你的代码来看,你似乎把一个锁释放了两次。首先,你获取了左叉子的锁:

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

撰写回答