如何理解死锁的四个必要条件?

2021-06-26 17:17:41 +08:00
 lolcat
死锁的四个必要条件:互斥条件、循环等待条件、占用且申请条件、不可抢占条件。

比如一个进程 fork 成两个进程 A 、B,共享内存中一个变量 X 的值为 0 。
A 进程阻塞了,必须等待 B 进程结束后 A 进程才继续运行,而 B 进程必须等待 A 进程把共享内存中变量 X 置 1 才继续运行。

这个例子中,我只看到了循环等待条件,请问互斥条件是什么?占用且申请条件是什么?不可抢占条件是什么?
2168 次点击
所在节点    程序员
6 条回复
lambdAlan
2021-06-26 17:29:11 +08:00
你这个例子描述的不完全。正确精准的例子是 A 进程进入临界区获取 A 的对象锁,想要操作共享变量需要获取 B 的对象锁,但是同时进程 B 也是同样状态,双方都持有自己的锁,都想获取对方的锁,且不主动释放自己的锁
lolcat
2021-06-26 17:33:35 +08:00
@lambdAlan 但是这个例子中我没加锁啊
lambdAlan
2021-06-26 19:05:15 +08:00
@lolcat 没加锁就没有死锁的概念了啊,要避免死锁就是打破 4 个必要条件之一,其中只有互斥是无法打破的,因为锁就是为了互斥。
gBurnX
2021-06-26 19:09:59 +08:00
这个问题里的变量 X,只是个障眼法,问题的答案与它无关。

1.互斥条件:
资源 1:进程 A 。
资源 2:进程 B 。
这里要把这两个进程当做唯一资源来理解,是这个问题的关键。
一个资源(进程 A 或经常 B ),每次只能被一个进程使用,即在一段时间内某资源仅为一个进程所使用。此时如果有其他进程请求该资源,则请求进程只能等待。


2.请求与保持条件:
对于进程 A 来说,进程 A 已经保持了至少一个资源(进程 A ),但又提出了新的资源请求(进程 B ),而该资源(进程 B )已经被其他进程(进程 B )占有,此时请求进程(进程 A )被阻塞,但对自己已经获得资源(进程 A )保持不放。


3.不可剥夺条件:
对于进程 B 来说,进程 B 未使用完的资源(经常 B )在未使用完毕之前,不能被其他进程(进程 A )强行夺走,即只能由获得该资源的进程(进程 B )自己来释放。
oneoyn
2021-06-27 20:00:04 +08:00
这种代码都能写出来 那你啊该考虑下是不是该换个行业发展了
lolcat
2021-07-01 16:21:27 +08:00
@oneoyn 1.我没写代码;2.我举了一个简单的例子;3.我举这个例子是为了方面说明一些概念;4.你没有看懂这个帖子表达的上述事实;5.这都没看懂,请问你是该考虑换个眼睛还是脑子?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/785956

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX