2015-11-25 41 views
1

我工作的进程同步,与游泳池问题的改进版本:信号灯:增强的游泳池

泳客想去游泳池:

  • 他们不得不采取一个空篮子
  • 他们有一个免费的小隔间
  • 他们把自己的泳装去,把自己的衣服的篮子和离开隔间
  • 他们游泳
  • 他们将回到一个自由柜与他们的篮子
  • 他们把自己的衣服回来,并离开隔间
  • 他们给空筐回
  • 有篮子的次数有限,隔间
  • 如果入浴不能找到一个空篮子或免费的小隔间,他会等到一个可用

改进版本:

  • 有成员和非成员
  • 成员拥有优先于非会员
  • 如果一个资源变为可用时,它会给予一个等待成员,如果有不是,它会给予任何人在等。

要做到这一点,我想我会用3个信号量:一个篮子,一个用于隔间,和一个用于等待的成员。这样,当一个成员等待时,信号量会阻止任何调用P(s_members)的进程,并且当一个成员最终得到一个篮子时,他调用V(s_members)。但是队列中可能有多个成员在等待,每次调用V(s_members)时,信号量都不应该“释放”非成员。这就是为什么我认为sembuf.sem_op = 0;将是一个很好的协议,因为非成员将不得不等待0
的问题是,这种解决方案:

  • 非成员必须调用P(s_basket)P(s_cubicle)之前调用P(s_members)
  • 非会员必须呼叫P(s_members)才能入睡并与其他人排队,但他们不需要增加/减少信号量的值,因为它不依赖于它们。
  • 等待资源的成员需要呼叫P(s_members)以增加/减少其值(因为他们在队列中),但他们不需要入睡并继续等待他们的篮子。
  • 设想一下这种情况:一名非会员正在等待他的篮子,目前队列中没有成员。然后,一位成员出现,显然他也在等待资源。此时,正在等待的非会员应该睡着,直到会员离开队列,但他们已经在睡觉等待他们的篮子,这意味着他们已经叫P(s_members)。因此,优先规则不适用。

我们该如何解决?
我希望它很清楚,很难解释和容易搞砸所有。 谢谢你的阅读时间。

编辑:
很抱歉,如果我张贴这种在错误的StackExchange社会,我会在下一次三思而后行!

+0

设计代码不是stackoverflow的工作,它不是执行问题场景分析的stackoverflow的工作。我们在这里回答两种问题1)为什么它不能编译?2)为什么产生了错误的输出?在任何一种情况下,您都必须发布您的代码,并在第一种情况下指出没有编译的内容。第二种情况是在输入,预期产出和实际产出后。一般来说,没有代码,没有帮助。我们不会为你做你的功课。 – user3629249

+0

谢谢你的帮助。 – qreon

回答

2

想象一下这种情况:非会员正在等待他的购物篮,并且 目前在队列中没有成员。然后,一位成员出现,显然,他也在等待资源。此时,正在等待的非会员应该睡着,直到成员 离开队列,但他们已经睡着了等待他们的 篮子,这意味着他们已经呼叫了P(s_members)。因此, 优先规则不适用。

所以你的意思是“如果一个非会员与成员一起睡在同一队列中,我们就被搞砸了”。我同意。一旦非会员进入队列中睡觉,你不能在之后将它们完全抽出。

由于非成员和成员不能等待同一信号量上的资源,所以s_basket必须是错误的。

如何尝试s_basket_memberss_basket_nonmembers

我相信你也需要跟踪几个int s,比如有多少成员/非成员在等待,以及有多少篮子可用。

+0

我会尝试一下,我有一些想法,谢谢你的提示:-) – qreon