如何在竞争条件下强制实现三向僵局

时间:2016-09-30 08:13:44

标签: multithreading algorithm locking deadlock

到目前为止我有什么

我正在编写一个死锁检测算法的测试用例。我们想要检测潜在的死锁情况。目前,我们正在检查无序获取的锁。

对此进行简单的双向测试如下:

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

我们正确地将此视为死锁。但是稍微延迟thread2,它不会死锁,但我们正确地将其检测为 potential 死锁:

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

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

我被困的地方

我正在编写涉及三个或更多线程的死锁的测试用例。我可以很容易地强迫这样的三方僵局:

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

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

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

1 个答案:

答案 0 :(得分:2)

使用不同的锁定顺序发生死锁时提供示例的最简单方法是及时分离所有线程的执行。你为两个线程的情况做了这样的事情:第一个线程获取并释放所有锁,然后才开始第二个线程。对于三线程情况是相同的:你可以完全运行第一个线程,然后第二个,然后第三个。

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

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

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