信号量:增强型游泳池

时间:2015-11-25 23:43:47

标签: c synchronization semaphore

我正在进行流程同步,改进了游泳池问题的版本:

  

泳客想去游泳池:

     
      
  • 他们必须拿一个空篮子
  •   
  • 他们必须进入一个免费的隔间
  •   
  • 他们穿上泳衣,把衣服放在篮子里,然后离开隔间
  •   
  • 他们游泳
  •   
  • 他们带着篮子回到一个免费隔间
  •   
  • 他们把衣服放回去,离开隔间
  •   
  • 他们把空篮子送回来了
  •   
  • 篮子和小隔间数量有限
  •   
  • 如果一个沐浴者找不到空篮子或一个免费隔间,他会等到一个可用的
  •   
     

改进版本:

     
      
  • 有会员和非会员
  •   
  • 会员优先于非会员
  •   
  • 如果有一个资源可用,它将被提供给等待的成员,如果没有,它将被提供给等待的任何人。
  •   

要做到这一点,我想我会使用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社区发布了这个,我下次会考虑一下!

1 个答案:

答案 0 :(得分:2)

  

想象一下这个案例:非成员正在等待他的篮子,并在那里   目前在队列中没有成员。然后,一名成员出现,   显然,他也在等待资源。此时,   等待的非会员应该在会员之前入睡   离开队列,但他们已经睡着了等待他们   篮子,这意味着他们已经打电话给P(s_members)。结果,   优先规则不适用。

所以你所说的是“如果一个非成员和成员一起睡在同一个队列中,我们就会被搞砸”。我同意。一旦非成员在队列中进入睡眠状态,您就无法在以后将它们完全拉出来。

由于非成员和成员无法等待同一信号量上的资源,s_basket必定是错误的。

如何尝试s_basket_memberss_basket_nonmembers

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