首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解wait()和signal()

理解wait()和signal()
EN

Stack Overflow用户
提问于 2013-03-29 08:53:44
回答 4查看 4.1K关注 0票数 0

我有两个进程P1和P2,它们共享3个信号量(s1,s2,s3),每个信号量的初始值为1,还有3个变量(x,y,z)

代码语言:javascript
复制
P1:                  P2:
wait(s1);            wait(s2);  
x = x + 1;           y = y * 2;
wait(s2);            wait(s3);
y = y - x;           z = z - y;
wait(s3);            signal(s2);
z = x + 2 * y - z;   wait(s1);
signal(s3);          x = x + 2;
signal(s2);          signal(s1);
signal(s1);          signal(s3);

如果我在一台只有一台中央处理器的计算机上同时运行它们,P1和P2会不会陷入死锁?

我的看法是,一旦它们开始运行,它们就都在等待(),这会导致它们坐着,直到有什么东西向它们发出信号()。既然没有其他东西在运行,那么它们不是都处于死锁状态吗?我觉得我错过了一些非常简单的知识,这阻碍了我的理解。任何洞察力都是值得感谢的!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-29 09:08:48

示例中的三个信号量被初始化为1,因此不会在每个进程的第一行阻塞。

现在考虑下面的示例运行:

  • P2将一直运行到等待(S1),也就是在该语句执行之前。此时,信号量s2和s1的计数为1,s3计数为0。
  • Now P1将一直执行,直到由于其值为0而无法获取等待(S3),但为了达到此目的,它已经取得了s1和s2
  • 的所有权。现在P2将恢复执行,但会立即被阻塞,等待s1

此时,两个进程都处于死锁状态。

票数 0
EN

Stack Overflow用户

发布于 2013-03-29 09:02:19

当P2等待( s1 )时,s1必须在P1的手中,因此P2不能继续发送信号(S3),然后永远等待P1(S3)。这就是死锁。

票数 0
EN

Stack Overflow用户

发布于 2013-03-29 09:15:02

两种死锁

1)信号(消耗资源)

-每个任务都在等待来自另一个任务的信号-不能退出

2)单位(可重用资源)

  • 等待另一个任务释放资源的每个任务通过中止任务返回,直到有足够的资源可用来释放其他任务。

信号死锁

最初,信号量a和b都是1。死锁

代码语言:javascript
复制
 if P1 and P2 complete their
first wait’s simultaneously before
attempting their second wait’s

可能不容易测试信号死锁

可能会导致死锁

代码语言:javascript
复制
 if P1 calls T(a,b) and
P2 calls T(b,a) at the same time.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15694712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档