Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的死锁_Python - Fatal编程技术网

python中的死锁

python中的死锁,python,Python,我正在解决这个问题,但是我得到一个错误 # Pick up the forks forks[self.left_fork].acquire() locked = forks[self.right_fork].acquire(False) if locked == True:

我正在解决这个问题,但是我得到一个错误

            # 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

然后给出该错误查看代码,您似乎要释放其中一个锁两次。首先,您获得左_叉锁:

forks[self.left_fork].acquire()
然后发布:

forks[self.left_fork].release()
然后在forks列表中切换这两个锁,因此释放的锁现在位于
fork[self.right\u 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()
调用可能是不正确的

其目的大概是检查锁定
右叉
的尝试是否失败,然后释放
左叉
,看起来应该是这样的:

# 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

您希望它打印什么?我不希望它冻结并出现错误,在给定的时间内,所有5个都应该正常运行?如果两个锁都被获取,那么破坏又有什么关系?这似乎没有道理->一旦一个哲学家抓住两个叉子(锁),这两个叉子就再也不能使用了。我试图实现注意,在这个例子中有两个循环:一个在
run
中,它调用
dine
,以及
dine
中的一个,其中包含尝试拾取叉子的代码。如果该解决方案对您有效,我建议您使用该解决方案,并在您更好地理解该算法之前避免创建自己的解决方案。但是,这会让0,2,4人受益,这是为什么?您可能会在交换锁时遇到问题(我不记得在我学习时这是问题的一部分)。此外,这种避免死锁的解决方案并不能保证任何个人都能同时获得这两个分叉。