我正在进行流程同步,改进了游泳池问题的版本:
泳客想去游泳池:
- 他们必须拿一个空篮子
- 他们必须进入一个免费的隔间
- 他们穿上泳衣,把衣服放在篮子里,然后离开隔间
- 他们游泳
- 他们带着篮子回到一个免费隔间
- 他们把衣服放回去,离开隔间
- 他们把空篮子送回来了
- 篮子和小隔间数量有限
- 如果一个沐浴者找不到空篮子或一个免费隔间,他会等到一个可用的
改进版本:
- 有会员和非会员
- 会员优先于非会员
- 如果有一个资源可用,它将被提供给等待的成员,如果没有,它将被提供给等待的任何人。
要做到这一点,我想我会使用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社区发布了这个,我下次会考虑一下!
答案 0 :(得分:2)
想象一下这个案例:非成员正在等待他的篮子,并在那里 目前在队列中没有成员。然后,一名成员出现, 显然,他也在等待资源。此时, 等待的非会员应该在会员之前入睡 离开队列,但他们已经睡着了等待他们 篮子,这意味着他们已经打电话给P(s_members)。结果, 优先规则不适用。
所以你所说的是“如果一个非成员和成员一起睡在同一个队列中,我们就会被搞砸”。我同意。一旦非成员在队列中进入睡眠状态,您就无法在以后将它们完全拉出来。
由于非成员和成员无法等待同一信号量上的资源,s_basket
必定是错误的。
如何尝试s_basket_members
和s_basket_nonmembers
?
我相信您还需要跟踪一些int
,例如有多少会员/非会员等待,以及有多少篮子可供使用。