Day 70:死锁(Deadlock)
![Image](/images/snake.png)
19年2月18日 · 武汉理工大学-艾勃特 14054 人阅读
(译者注:锁定(Lock)是指一个进程对内存资源进行排他占用的状态;死锁(Deadlock)是一种多个并行进程同时运行时可能出现的导致程序无法继续运行的死循环错误,应该在程序设计时注意避免。)
死锁(Deadlock)这玩意,从来没人教过我怎么去实现,也没人要求我这么去做过。不过嘛,这些年来,我自己还是成功实现了几次的。(笑)
这个算法挑战栏目本来就是为了好玩的,干脆今天再试着弄一次死锁吧!
我会在分别在不同的线程上运行若干个子程序。想象一下,这些子程序呈环形结构排列,每两个子程序之间有一个可以占用的内存资源。
每个子程序有一个自己的ID,P(n),每一个内存资源也有一个自己的ID,R(n)。子程序对内存资源的占用是排他的。
那么在什么情况下会出现死锁?
1. P(n)取得R(n)
2. P(n)等待R(n-1)被释放
![]() |
两个进程都需要资源来继续执行。P1需要额外的资源R1并且拥有资源R2,P2需要额外的资源R2并且拥有R1 ; 两个过程都不能继续。(来源:Wikipedia)
我设计的程序是这样运作的:
1. N个子程序反复占用并释放共有的内存资源
2. 主线程在等死锁出现
3. 一旦死锁出现,主线程就会释放所有会导致各个线程出现RuntimeError错误的锁定。
注:任何线程都可以释放先前出现的锁定,因为这里的锁定是无法再次进入的。但是尝试释放一个不在占用状态的锁定,就会导致RuntimeError。
测试时间到!现在我问你们,如果你们不去运行这个程序,你们能发现哪里会有bug吗?此处bug指程序运行中一切偏离上述三条要求的行为。
内存共享状态(Shared State)
主程序
测试
结果
Python3Turtle