• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lolcat
V2EX  ›  程序员

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

  •  
  •   lolcat · Jun 26, 2021 · 3099 views
    This topic created in 1810 days ago, the information mentioned may be changed or developed.
    死锁的四个必要条件:互斥条件、循环等待条件、占用且申请条件、不可抢占条件。

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

    这个例子中,我只看到了循环等待条件,请问互斥条件是什么?占用且申请条件是什么?不可抢占条件是什么?
    6 replies    2021-07-01 16:21:27 +08:00
    lambdAlan
        1
    lambdAlan  
       Jun 26, 2021 via Android
    你这个例子描述的不完全。正确精准的例子是 A 进程进入临界区获取 A 的对象锁,想要操作共享变量需要获取 B 的对象锁,但是同时进程 B 也是同样状态,双方都持有自己的锁,都想获取对方的锁,且不主动释放自己的锁
    lolcat
        2
    lolcat  
    OP
       Jun 26, 2021
    @lambdAlan 但是这个例子中我没加锁啊
    lambdAlan
        3
    lambdAlan  
       Jun 26, 2021 via Android
    @lolcat 没加锁就没有死锁的概念了啊,要避免死锁就是打破 4 个必要条件之一,其中只有互斥是无法打破的,因为锁就是为了互斥。
    gBurnX
        4
    gBurnX  
       Jun 26, 2021   ❤️ 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  
       Jun 27, 2021
    这种代码都能写出来 那你啊该考虑下是不是该换个行业发展了
    lolcat
        6
    lolcat  
    OP
       Jul 1, 2021
    @oneoyn 1.我没写代码;2.我举了一个简单的例子;3.我举这个例子是为了方面说明一些概念;4.你没有看懂这个帖子表达的上述事实;5.这都没看懂,请问你是该考虑换个眼睛还是脑子?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5794 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 02:58 · PVG 10:58 · LAX 19:58 · JFK 22:58
    ♥ Do have faith in what you're doing.