【问题标题】:Unable to figure out a deadlock situation无法确定死锁情况
【发布时间】:2014-08-29 05:15:11
【问题描述】:

我在 The Little Book of Semaphores 中探索信号量并遇到了以下示例。 (aArrived 和 bArrived 指的是两个信号量)

线程 A

1.statement a1

2.bArrived.wait()

3.aArrived.signal()

4.statement a2

线程 B

1.statement b1

2.aArrived.wait()

3.bArrived.signal()

4.statement b2

两个线程同时执行,约束是保证a1发生在b2之前,b1发生在a2之前。

现在书中提到这是一个僵局。

我对观众的要求是解释为什么在这个解决方案中会出现死锁,因为我无法弄清楚。

另外还有两个解决方案没有导致任何死锁。如果上面的解决方案有死锁,那么下面的解决方案怎么没有死锁:

解决方案2:

线程 A

1.statement a1

2.aArrived.signal()

3.bArrived.wait()

4.statement a2

线程 B

1.statement b1

2.bArrived.signal()

3.aArrived.wait()

4.statement b2

解决方案3:

线程 A

1.statement a1

2.bArrived.wait()

3.aArrived.signal()

4.statement a2

线程 B

1.statement b1

2.bArrived.signal()

3.aArrived.wait()

4.statement b2

【问题讨论】:

    标签: multithreading deadlock semaphore


    【解决方案1】:

    在您的第一个解决方案中,两个线程都在步骤 2 中被阻塞,等待各自的另一个线程发出继续信号。

    这里的行为是,对于每个线程,发出另一个线程继续的信号的条件是它们自己已经被发出信号。这当然行不通:每个人都在等待,没有人收到信号。

    其他两个解决方案通过让两个线程中的至少一个线程在等待自己的信号到达之前向另一个线程发送信号来解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      相关资源
      最近更新 更多