我正在信号量小书中探索信号量,并且遇到了下面的例子。 (aArrived和bArrived指的是两个信号量)
主题A
1.声明a1
2.bArrived.wait()
3.aArrived.signal()
4.声明a2
主题B
1.声明b1
2.aArrived.wait()
3.bArrived.signal()
4.陈述b2
两个线程并发执行,约束是保证a1在b2之前发生,b1在a2之前发生。
现在在书中提到这是一个僵局。
我向观众提出的要求是解释为什么在此解决方案中发生死锁,因为我无法弄明白。
另外还有两个解决方案没有导致任何僵局。如果在上面的解决方案中存在死锁,那么在下面的解决方案中如何没有死锁:
溶液2:
主题A
1.声明a1
2.aArrived.signal()
3.bArrived.wait()
4.声明a2
主题B
1.声明b1
2.bArrived.signal()
3.aArrived.wait()
4.陈述b2
Solution3:
主题A
1.声明a1
2.bArrived.wait()
3.aArrived.signal()
4.声明a2
主题B
1.声明b1
2.bArrived.signal()
3.aArrived.wait()
4.陈述b2
答案 0 :(得分:0)
在第一个解决方案中,两个线程都在步骤2
中被阻止,等待相应的其他线程发出信号以继续。
这里的行为是,对于每个线程,指示另一个线程继续的条件是它们本身已经发信号通知。这当然不会成功:每个人都在等待,没有人会发出信号。
另外两个解决方案解决了这个问题,让两个线程中的至少一个在等待自己的信号到达之前将信号发送到另一个。