北京邮电大学 张彦博
针对理发师问题进行了拓展,考虑多种需求的顾客,多种功能的理发师,在Linux下利用pthread给出多线程解决方案。
传统理发师问题针对一位单一功能的理发师和多位单一需求的顾客,但是在实际应用中,问题往往更加复杂,理发师将会有多种功能,顾客也会有多种需求,比如理发和烫发。拓展过后的理发师问题可以较为方便的拓展到其他领域,因此,需要对传统的理发师问题解法进行改良。本文给出对传统理发师问题更贴近实际的一种拓展,并针对拓展问题给出了解决方案,以供解决同类问题借鉴。
为了符合实际情况,以利于拓展,添加如下假设:
(1)理发师可以由一种或多种功能(如理发或烫发);
(2)顾客可以有选择多种需求,但一个顾客只能选择一种;
(3)一定条件下顾客可以等待。
一家理发店里有X位理发师,其中N个理发师只会理发,M个理发师可以烫发或理发(烫发优先,没有顾客烫发时,才会理发)。店内有Y把供等候理发顾客坐的椅子。如果没有顾客,则理发师在理发椅上睡觉。当一个需要理发的顾客到来时,他会优先叫醒只会理发的理发师,除非只会理发的理发师已经为他人服务;需要烫发顾客来时,只会找烫发的理发师(如果当前烫发的理发师空闲,则直接为其进行烫发服务;如果当前有理发的顾客,则为该顾客理发完后才为下一位顾客进行烫发服务,当前需要烫发的顾客需等待)。如果X个理发师正在为X个顾客服务时,又有顾客来到,并且如果有空椅子可坐,他们就坐下来等待。如果没有空椅子,他会按一定条件选择等待或离开。假定烫发时间长于理发时间,烫发理发时间固定。
首先将问题简化,假设理发师一共有三个,两个只能理发的理发师和一个可以理发也可以烫发的理发师。首先对理发师进行分析,对于单一功能理发师(只能理发的理发师),其只能理发,则和传统理发师问题一样处理即可。核心代码如下:
void* C_barber(){//普通理发师,只会理发
while(1) {
if(waiting == 0)
对于由多功能理发师和多需求顾客的理发师问题,本文给出一种可行解。同时,可以发现,本文给出的方法比较容易拓展,能比较轻松地应用到理发师问题的其他变种里面去。