问题描述:
一个理发店由一个N张沙发的等候室和一张理发椅组成。没有顾客理发时,理发师便去睡觉。
当一个顾客走进理发店的时候,如果所有的沙发都满了,便离开理发店;否则,如果理发师正在给其他顾客理发,则找一张空沙发坐下等待;如果理发师因无顾客正在理发,则新到的顾客唤醒理发师为其理发,在理发后,
顾客必须付费,直到理发师收费后才离开理发店。使用信号量实现这一同步问题。
分析:在本题中顾客进程和理发师进程之间存在多种同步关系。
1,只有理发椅空闲时,顾客才能坐到理发椅上等待理发师理发,否则顾客必须等待。
只有理发椅上有顾客时,理发师才能开始理发,否则必须等待。
这种同步关系类似单缓冲池的生产者和消费者问题中的同步关系,故可用信号量empty和full来实现。
2,理发师为顾客理发时,顾客必须等待理发的完成,并在理完发后理发师将其唤醒他。这可单独使用信号量cut来控制。这种关系和生产者向缓冲区中添加产品和消费者从缓冲区中取出一件产品一样。当生产者向缓冲区中添加了一件产品后,从等待队列中选出一个消费者进程将其唤醒一样。
3,顾客理完发后必须向理发师付费,并等理发师收费后顾客才能离开;而理发师则需要等待顾客付费,并在收费后将其唤醒后才能离开,这可以分别通过两个信号量payment和receipt来控制。
4,等候室中的N张沙发是顾客竞争的资源,故还需设置一个资源信号量sofa.
5,
为了控制顾客的人数,使顾客能在所有座位被占用的情况下离开理发店,还必须涉资一个整型变量count
来对理发店中的顾客人数进行统计,该变量将被多个顾客进程互斥的访问并修改,这可通过一个互斥信号量
mutex来实现。这个类似读者-写着问题中,第一个进来的读者进程要将互斥信号量wmutex wait()操作。
最后一个进来的读者需要wmutex sigal()操作。
为解决上述问题,需要设置一个整型变量count来对理发店中的顾客进行统计。
一共需要七个信号量来实现顾客进程对count来互斥访问,将其初值设为1.
sofa是对应于等候室中的N张沙发的资源信号量,初值设为N.
empty来表示是否空闲的理发椅,其初值设为1,
full表示理发椅是否有等待理发椅的顾客,其初值为0.
cut用来等待理发的完成,其初值为0.
payment表示用来等待付费,其初值为0.
receipt用来等待收费,其初值为0.