【发布时间】: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