Multithreading 无法找出死锁的情况

Multithreading 无法找出死锁的情况,multithreading,deadlock,semaphore,Multithreading,Deadlock,Semaphore,我在《信号灯小书》中探讨了信号灯,遇到了下面的例子。(A驱动和禁用是指两个信号灯) 线程A 1.1报表a1 2.禁止等待 3.A驱动信号() 4.2报表a2 线程B 1.1报表b1 2.A驱动。等等 3.禁止信号() 4.2报表b2 两个线程同时执行,约束条件是保证a1发生在b2之前,b1发生在a2之前 书中提到这是一个僵局 我对听众的要求是解释为什么在这个解决方案中会出现死锁,因为我无法理解它 此外,还有两种解决方案没有导致任何僵局。如果在上述解决方案中存在死锁,那么为什么在以下解决方案中没有

我在《信号灯小书》中探讨了信号灯,遇到了下面的例子。(A驱动和禁用是指两个信号灯)

线程A

1.1报表a1

2.禁止等待

3.A驱动信号()

4.2报表a2

线程B

1.1报表b1

2.A驱动。等等

3.禁止信号()

4.2报表b2

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

书中提到这是一个僵局

我对听众的要求是解释为什么在这个解决方案中会出现死锁,因为我无法理解它

此外,还有两种解决方案没有导致任何僵局。如果在上述解决方案中存在死锁,那么为什么在以下解决方案中没有死锁:

解决方案2:

线程A

1.1报表a1

2.A驱动信号()

等一下

4.2报表a2

线程B

1.1报表b1

2.禁止信号()

等一下

4.2报表b2

解决方案3:

线程A

1.1报表a1

2.禁止等待

3.A驱动信号()

4.2报表a2

线程B

1.1报表b1

2.禁止信号()

等一下

4.2报表b2


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

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

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