【问题标题】:Semaphores the output of the following信号量以下的输出
【发布时间】:2013-06-20 22:50:20
【问题描述】:

我想知道这个程序的输出,请一步一步来。 最初,值为: S1=0 , S2=1 , S3=0, a=1。在此处输入代码

p1                  p2                  p3
while(1) {       while(1){             while(1){  
P(S1)            P(S2);               P(S3);
a=2*a;         a=a+1;               P(S3);
V(S3) }        V(S1);               printf("%d\n",a);
                   V(S3) }              V(S2);

【问题讨论】:

  • 我们不是来帮你做作业的。如果我们愿意,我们也不能,因为您没有定义 P 和 V 是什么。这些与信号量有什么关系?
  • 我同意 Gabe 的观点,它看起来真的像家庭作业。如果不是,您应该编辑您的问题。
  • @GabeSechan P 和 V 是古典文献中“进入”和“退出”信号量函数的名称。
  • 不,这不是家庭作业,这是我尝试做的来自互联网的练习,但无法达到他们提供的解决方案
  • @Ivan:所以也许提供一个练习链接,它的解决方案并解释你在解决方案中不明白的地方?

标签: semaphore


【解决方案1】:

您链接的解决方案是正确的。 用非正式的术语来说:P 在信号量 == 0 时阻塞或递减信号量并继续; V 增加信号量。

一开始 S1 和 S3 == 0,所以 p1 和 p3 被阻塞了。

p2 是唯一可以运行的。它增加 a (== 2) 并增加 S1 和 S3。它无法继续,因为 S2 现在为 0。

p3 只能做一步,因为在第一次 P 调用之后,S3 == 0 又一次。

p1 是唯一可以工作的进程。它将 a (== 4) 加倍,然后解除对 S3 的阻塞。无法继续,因为 S2 又为 0。

现在 p3 是唯一可以运行的。它打印 4。然后解锁 p2。

请注意,情况与问题开始时完全相同(现在 a == 4 除外)。所以每个循环都以完全相同的方式运行:p2 递增 a,p1 将 a 加倍,p3 打印 a。重复。

因此打印值为 4、10、22、46...

【讨论】:

  • 我不明白p3是如何进入printf区的,因为那里总是有2个P(S3),它不应该被一遍又一遍地阻塞吗?
  • 有两个P(S3),所以需要两个V(S3)才能进入(假设一开始S3 == 0)。它在 p2 结束时得到一个 V,在 p1 结束时得到第二个 V。
  • "p1 是唯一可以工作的进程。它将 a (== 4) 加倍然后解除阻塞 S3。它无法继续,因为 S2 再次为 0。"这里不是 S3=1 吗?
  • 它是 1 还是 0,取决于 p2 是否已经完成了 V(S3),以及 p3 是否已经完成了它的第一个 P(S3)。但最终结果总是一样的:p2 先运行——因为它可以。 p1 第二个运行,因为它在 p2 的末尾等待。 p3 最后运行,因为它在 p2 和 p1 的末尾都等待。
  • 非常感谢 @jods 抽出时间来解释这个练习
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多