Operating system 从视觉上看,僵局在哪里?为什么?如何避免/修复?

Operating system 从视觉上看,僵局在哪里?为什么?如何避免/修复?,operating-system,mutex,semaphore,Operating System,Mutex,Semaphore,我试图理解并解决以下问题 以下程序尝试使用一对t和s来进行 最初:s=1,t=0 请记住: p操作会浪费时间或休眠,直到资源被 信号量变为可用,此时资源将被激活 立即声称 V操作是相反的:它使资源再次可用 在流程完成使用后 1。为什么此程序会导致死锁? 2。可以对初始信号量值进行哪些更改以消除死锁可能性? 更新 根据评论,我能够更好地理解并直观地说明下面的死锁,因此请让我知道我是否理解正确 如果线程1在线程2之前到达,死锁是如何发生的: 如何解决这个问题 将t的值初始设置为1提示:您可以通

我试图理解并解决以下问题

以下程序尝试使用一对ts来进行

最初:s=1,t=0

请记住:

p操作会浪费时间或休眠,直到资源被 信号量变为可用,此时资源将被激活 立即声称

V操作是相反的:它使资源再次可用 在流程完成使用后


1。为什么此程序会导致死锁?

2。可以对初始信号量值进行哪些更改以消除死锁可能性?


更新 根据评论,我能够更好地理解并直观地说明下面的死锁,因此请让我知道我是否理解正确

如果线程1在线程2之前到达,死锁是如何发生的:

如何解决这个问题


t的值初始设置为1

提示:您可以通过锁顺序避免死锁。例如,所有代码必须先锁定
s
,然后才能锁定
t
。这个问题表明,如果情况不是这样,会发生什么。您可以“更改初始信号量值”以符合锁顺序。

死锁位于
第3行。在这一行,两个
线程都在连续等待获取资源
t
上的锁。
t
的初始值为0,这意味着它已经处于锁定状态,因此,例如,如果
Thread1
首先到达
第3行
,它将等待直到
t
的值变为1,类似地,一段时间后
Thread2
将在同一行等待
t
变为1。这样,两个进程都将持续等待资源创建“死锁”。

为什么必须在t之前锁定s?我相信@prince是正确的……你认为呢?所以要解决这个潜在的死锁,最好先设置t=1。@lucidgold请看
t
的初始值应该根据你的要求设置。它可以是
0-n
之间的任何值。例如,如您在问题中所问,
t
的初始值为0,这意味着资源已被锁定,为了避免出现死锁,您必须在
Thread1
Thread2
中调用
V(t)
而不是
P(t)
(同样,这取决于您的要求。这是有意义的,谢谢。但我只想确保最初设置t=1将修复第3行上的死锁,这将允许线程1获取t,这将迫使线程2等待,但最终不会发生其他死锁,假设只有线程1和线程2正在访问t….这是否正确“LuxGoD”总是不正确的。考虑这一点,例如“代码>线程1 < /代码>和代码>线程2 < /代码>完成它们的处理,直到<代码>行2 < /代码>之后,如果<代码> thRe2再次获得<代码> CPU时间>代码>执行将是其他方式,即“代码> thRe1/<代码>将等待,<代码> thRe2要求锁定。否则,如果
Thread1
Thread2
之前获得了
CPU时间,则执行将与您预期的一样。因此,请记住一件事,在这种情况下,哪个线程在
t
上获得锁定取决于CPU调度。@lucidgold否,它不会出现在上述代码行中。
    Thread 1    Thread 2
    --------    --------
1.  P(s);       P(s);
2.  V(s);       V(s);
3.  P(t);       P(t);
4.  V(t);       V(t);