首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >信号灯:强化游泳池

信号灯:强化游泳池
EN

Stack Overflow用户
提问于 2015-11-25 23:43:46
回答 1查看 227关注 0票数 1

我正在处理过程同步问题,并改进了游泳池问题:

游泳者想去游泳池:

  • 他们得拿个空篮子
  • 他们必须在一个免费的小隔间里
  • 他们穿上泳衣,把衣服放在篮子里,然后离开小隔间。
  • 他们游泳
  • 他们带着篮子回到一个免费的小隔间。
  • 他们把衣服穿上,离开小隔间。
  • 他们把空篮子还给我
  • 篮子和小隔间的数量有限
  • 如果一个人找不到空篮子或一个免费的小隔间,他就会等到一个空篮子空出来。

改进版本:

  • 有会员也有非会员。
  • 会员优先于非会员。
  • 如果一个资源变得可用,它将被分配给一个等待的成员,如果没有,它将被给予任何等待的人。

为了做到这一点,我想我应该使用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社区上发布了这个,下次我会三思而后行!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-26 00:40:41

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

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

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

试试s_basket_memberss_basket_nonmembers怎么样?

我相信您还需要跟踪一些int,比如有多少成员/非会员在等待,以及有多少篮子可用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33928365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档