我正在处理过程同步问题,并改进了游泳池问题:
游泳者想去游泳池:
改进版本:
为了做到这一点,我想我应该使用3个信号量:一个用于篮子,一个用于隔间,另一个用于等待成员。这样,当一个成员等待时,信号量会阻止任何调用P(s_members)的进程,当一个成员最终得到一个篮时,他会调用V(s_members)。但是队列中可能有几个成员在等待,每次调用V(s_members)时,信号量都不应该“释放”一个非成员。这就是为什么我认为sembuf.sem_op = 0;是一个好交易的原因,因为非成员必须等待0。
问题是,使用这种解决方案:
P(s_members)或P(s_cubicle)之前调用P(s_basket)。P(s_members)才能入睡并与其他人一起排队,但是他们不需要增加/减少信号量的值,因为它不依赖于它们。P(s_members)来增加/降低其值(因为他们在队列中),但是他们不需要睡着,继续等待他们的篮子。P(s_members)。因此,优先权规则不适用。我们怎样才能解决这个问题?
我希望这是足够清楚,这是很难解释和容易搞砸这一切。谢谢你花时间看这个。
编辑:
对不起,如果我在错误的StackExchange社区上发布了这个,下次我会三思而后行!
发布于 2015-11-26 00:40:41
想象一下这样的情况:一个非会员在等待他的篮子,而此时排队的没有成员。然后,一个成员出现了,显然,他也在等待资源。此时,也在等待的非会员应该睡着,直到成员离开队列,但是他们已经在等待他们的篮子,这意味着他们已经调用了P(s_members)。因此,优先权规则不适用。
所以你的意思是“如果一个非会员和成员睡在同一个队列里,我们就完蛋了”。我同意。一旦一个非会员在队列中进入睡眠状态,你就不能在以后把他们拉出来。
因为非成员和成员不能在同一个信号量上等待资源,所以s_basket一定是错误的。
试试s_basket_members和s_basket_nonmembers怎么样?
我相信您还需要跟踪一些int,比如有多少成员/非会员在等待,以及有多少篮子可用。
https://stackoverflow.com/questions/33928365
复制相似问题