搜索
当前位置: 秒秒彩官网 > 读入原语 >

理发师问题(linux下实现)有问题

gecimao 发表于 2019-05-09 14:55 | 查看: | 回复:

  一家理发店有一间有n把椅子的等待室和一把理发椅的理发室。如果没有顾客,理发师就去睡觉。如果顾客来时所有的椅子都有人,那么顾客将会离去。如果理发师在忙,而又有空闲的椅子,那么顾客会坐在其中一个空闲的椅子上。如果理发师在睡觉,顾客会摇醒他。

  3、“如果没有顾客,理发师就去睡觉。”&&“如果理发师在忙,而又有空闲的椅子,那么顾客会坐在其中一个空闲的椅子上。”说明理发师必须等有顾客才能开始理发,而顾客必须等理发师有空(相对的有空,比如理发师在睡觉那么理发师是真的有空,如果是正常排队轮到自己了,那么理发师是相对有空(自己相对其他等待的人来说)),由此可知,理发师与顾客之间还有一个同步问题。

  先分析顾客之间互斥的实现,考虑到这是多个顾客等待多把椅子,即资源有限,顾客之间竞争。第一种方案可以类比生产者、消费者问题,利用一对信号量分别表示等待座位的满位和空位人数,但是“如果顾客来时所有的椅子都有人,那么顾客将会离去。”说明顾客竞争不到资源必须放弃竞争,而不能一直等待,显然利用生产者消费者模型,顾客一定会无限期等待直到等到资源,显然该方案应该被否定。在类比读写者问题,可以用一个全局变量来表明等待座位上的人数,这样的话,新顾客可以根据这个变量的值判断等待室的人是否已经满了,从而决定是否继续等待。从而根据全局变量的值实现顾客之间的互斥。另外,只要有全局变量,我们就应注意到这个全局变量是一种临界资源,所以就应该考虑到临界资源访问的互斥问题,所以这里需要一个信号量(设为mutex),用来实现全局变量访问间的互斥。

  理发师必须等待有顾客才开始工作,否则睡觉(此处睡觉,可以用理发师在等待一个信号量符合要求实现),所以考虑为顾客的人数设置一个信号量,每次理发师提取顾客进行理发之前必须先对该信号量进行判断,只有该信号量符合要求(有顾客)时,才进行才进行从等待室提取顾客,理发操作。否则无限等待该信号成立,即睡觉。

  再来分析顾客对理发师的操作,只有等待室的人没有坐满时,顾客才有可能对理发师有操作。若理发师在忙,则顾客等待(等待的人数变化),若理发师在睡觉,则唤醒理发师(由于上面理发师操作中实现理发师的睡觉操作是通过等待有顾客实现的,所以此处不用刻意去对没有等待顾客,理发师在睡觉的情况单独处理,只需使顾客人数信号量++,即可唤醒理发师(如果在睡眠的话))。

  {//虽然此处有全局变量Is_Sleeping的访问,但是不用在利用例外一个信号量将其包起来,因为print2的调用地方只有一个,已经用Mutex包起来了,与另一出Is_Sleeping的改变处对应的正好

  每次每个理发师总是莫名的为两个顾客同时理完发,不知为啥,我看过,由于平均两个顾客到达的时间差正好是理发师理发所用时间的一半,所以平均每次理发师有两个顾客到达,期间,第2n+1个顾客应该正常,但是第2n+2个顾客一到达就直接获得Wait_Leave信号,不再在P(Wait_Leave)处等待,直接离开,当然第2n+1个也离开了,这样的线个顾客没有进行P(Custom)操作,导致最后理发师在P(Custom)处等待,但是由于Wait_Person为5,达到了最大容量,所以每次刚到的顾客都会直接离开,表示很困惑,所有对Custom和Wait_Person的操作都是同步的,最后两者的值竟然不一样了?

本文链接:http://k-mood.com/duruyuanyu/266.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部