【问题标题】:Semaphores : enhanced swimming pool信号量:增强型游泳池
【发布时间】:2015-11-25 23:43:46
【问题描述】:

我正在处理进程同步,改进版的游泳池问题:

沐浴者想去游泳池:

  • 他们必须拿一个空篮子
  • 他们必须进入一个免费的隔间
  • 他们穿上泳衣,把衣服放进篮子里,离开了隔间
  • 他们游泳
  • 他们带着篮子回到一个空闲的隔间
  • 他们重新穿上衣服,离开了隔间
  • 他们把空篮子还了
  • 篮子和隔间的数量有限
  • 如果沐浴者找不到空篮子或空闲隔间,他会等到有空的时候

改进版:

  • 有会员和非会员
  • 会员优先于非会员
  • 如果某个资源可用,则会将其提供给等待中的成员,如果没有,则将其提供给等待中的任何人。

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

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

我们如何解决这个问题?
我希望它足够清楚,很难解释,也很容易把它搞砸。 感谢您抽出宝贵时间阅读本文。

编辑:
抱歉,如果我在错误的 StackExchange 社区上发布了此内容,我下次会三思而后行!

【问题讨论】:

  • stackoverflow 的工作不是设计你的代码,也不是 stackoverflow 的工作来分析你的问题场景。我们在这里回答两种问题:1)为什么它不能编译,2)为什么会产生错误的输出。无论哪种情况,您都必须发布您的代码,并在第一种情况下准确指出未编译的内容。在第二种情况下,发布输入、预期输出和实际输出。一般来说,没有代码,没有帮助。我们不会为你做作业。
  • 感谢您的帮助。

标签: c synchronization semaphore


【解决方案1】:

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

所以你的意思是“如果非会员和会员在同一个队列中睡觉,我们就完蛋了”。我同意。一旦非成员在队列中进入睡眠状态,您以后就不能完全将他们拉出来。

由于非成员和成员不能在同一个信号量上等待资源,s_basket 一定是错误的。

试试s_basket_memberss_basket_nonmembers怎么样?

我相信您还需要跟踪一些ints,例如有多少会员/非会员在等待,有多少购物篮可用。

【讨论】:

  • 我要试试,我有一些想法,谢谢你的提示:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
相关资源
最近更新 更多