V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lolcat
V2EX  ›  程序员

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

  •  
  •   lolcat · 2021-06-26 17:17:41 +08:00 · 2136 次点击
    这是一个创建于 1006 天前的主题,其中的信息可能已经有所发展或是发生改变。
    死锁的四个必要条件:互斥条件、循环等待条件、占用且申请条件、不可抢占条件。

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

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

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


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


    3.不可剥夺条件:
    对于进程 B 来说,进程 B 未使用完的资源(经常 B )在未使用完毕之前,不能被其他进程(进程 A )强行夺走,即只能由获得该资源的进程(进程 B )自己来释放。
    oneoyn
        5
    oneoyn  
       2021-06-27 20:00:04 +08:00
    这种代码都能写出来 那你啊该考虑下是不是该换个行业发展了
    lolcat
        6
    lolcat  
    OP
       2021-07-01 16:21:27 +08:00
    @oneoyn 1.我没写代码;2.我举了一个简单的例子;3.我举这个例子是为了方面说明一些概念;4.你没有看懂这个帖子表达的上述事实;5.这都没看懂,请问你是该考虑换个眼睛还是脑子?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1396 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:30 · PVG 01:30 · LAX 10:30 · JFK 13:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.