gpt4 book ai didi

multithreading - 如何用竞争条件强制三向死锁

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:54:57 30 4
gpt4 key购买 nike

到目前为止我有什么

我正在为死锁检测算法编写测试用例。我们想要检测潜在的死锁场景。目前,我们正在检查是否乱序获取了锁。

一个简单的双向测试如下:

  • Thread1 获取 Lock1
  • Thread2 获取 Lock2
  • Thread1 阻止尝试获取 Lock2
  • Thread2 阻止尝试获取 Lock1 <-- DEADLOCK

我们正确地将此检测为死锁。但是稍微延迟线程 2,它不会死锁,但我们正确地将其检测为潜在死锁:

  • Thread1 获取 Lock1
  • Thread1 获取 Lock2
  • Thread1 释放两个锁
  • Thread2 获取 Lock2
  • Thread2 获取 Lock1
  • 继续正常执行。

我们将此检测为潜在的死锁,因为 Thread1 获取这些锁的顺序与 Thread2 不同。因此,如果时机恰到好处,就有可能出现僵局。

我卡在哪里

我正在围绕涉及三个或更多线程的死锁编写测试用例。我可以像这样轻松地强制执行三向死锁:

  • Thread1 获取 Lock1
  • Thread2 获取 Lock2
  • Thread3 获取 Lock3
  • Thread3 阻止获取 Lock2
  • Thread2 阻止获取 Lock1
  • Thread1 阻止获取 Lock3

同样,我们可以正确地将其检测为死锁。

但是我如何将这个测试用例从有保证的死锁更改为潜在的死锁?我将如何更改时间以继续正常执行?

最佳答案

提供不同加锁顺序不发生死锁的例子最简单的方法是及时将所有线程分开执行。您是针对双线程情况这样做的:第一个线程获取并释放所有锁,然后第二个线程才启动。对于三线程情况,情况是一样的:您可以完全运行第一个线程,然后是第二个,然后是第三个。

更复杂的场景也是可能的:

  • Thread1 获取 Lock1
  • Thread3 获取 Lock3
  • Thread1 阻止获取 Lock3
  • Thread3 获取 Lock2
  • Thread2 阻止获取 Lock2
  • Thread3 完成并释放 Lock3 和 Lock2
  • Thread2 获取 Lock2
  • Thread2 阻止获取 Lock1
  • Thread1获取Thread3释放的Lock3,完成并释放Lock1和Lock3
  • Thread2 获取Lock1,完成并释放锁

但如果您想要演示,最简单的线程连续执行是最容易理解的。

关于multithreading - 如何用竞争条件强制三向死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39786732/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com