我工作的进程同步,与游泳池问题的改进版本:信号灯:增强的游泳池
泳客想去游泳池:
- 他们不得不采取一个空篮子
- 他们有一个免费的小隔间
- 他们把自己的泳装去,把自己的衣服的篮子和离开隔间
- 他们游泳
- 他们将回到一个自由柜与他们的篮子
- 他们把自己的衣服回来,并离开隔间
- 他们给空筐回
- 有篮子的次数有限,隔间
- 如果入浴不能找到一个空篮子或免费的小隔间,他会等到一个可用
改进版本:
- 有成员和非成员
- 成员拥有优先于非会员
- 如果一个资源变为可用时,它会给予一个等待成员,如果有不是,它会给予任何人在等。
要做到这一点,我想我会用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社会,我会在下一次三思而后行!
设计代码不是stackoverflow的工作,它不是执行问题场景分析的stackoverflow的工作。我们在这里回答两种问题1)为什么它不能编译?2)为什么产生了错误的输出?在任何一种情况下,您都必须发布您的代码,并在第一种情况下指出没有编译的内容。第二种情况是在输入,预期产出和实际产出后。一般来说,没有代码,没有帮助。我们不会为你做你的功课。 – user3629249
谢谢你的帮助。 – qreon