C语言 死锁条件(科夫曼条件)



[https://en.wikipedia.org/wiki/Deadlock#Necessary_conditions][1]

在这篇维基百科文章中,作者提到,为了发生死锁,必须满足四个条件(相互排斥、保持和等待、循环等待、无抢占(。 如果没有验证,就不会有死锁。

让我们看看这种情况。

semaphore s(0); // initialized with 0
wait(s);
rest of code...

正如我们所看到的,该过程不会取得任何进展,因此死锁的定义是有效的。 虽然没有其他进程可以发出信号S,所以没有抢占被验证。 但 Circular Wait 和 H&W 和 MuEx 都没有。 在这种情况下是否出现死锁,是否验证了所有条件? 还是我对死锁的定义有误?

当一个进程 p1 和第二个进程 p2 竞争关键部分时,会发生死锁:

p1: wait(Q); wait(S); ...
p2: wait(S); wait(Q); ...
  • 保持并等待:如果进程需要两个信号量(如 Q 和 S(才能转到关键部分。 P1 获取 Q 和 P2 获取 S,利用并声明可用内容。
  • 无预处理:任何进程都无法强制停止另一个进程以声明 Q 或 S
  • 互斥:一次只允许一个进程。
  • 循环:P1->P2->P1 表示 P1 等待 P2 获取 S,P2 等待 P1 获取 Q。

有时上述 3 个条件都满足,但仍然没有死锁。 所以这取决于情况。

最新更新