理发师问题的实现说明书.docVIP

  • 21
  • 0
  • 约4.81千字
  • 约 18页
  • 2017-12-10 发布于河南
  • 举报
理发师问题的实现说明书

打瞌睡的理发师 理发师问题是一个利用信号量进行PV操作的经典问题。设计程序实现此问题,要使得理发师的活动与顾客的活动得到各自真实的模拟。所执行的程序应体现:理发师在没有顾客的时候去睡觉,有顾客则工作;顾客在理发师工作时坐下等待,无座时离开,直至等到理发师自己理发。 打瞌睡的理发师问题是一种同步问题的抽象描述。计算机系统中的每个进程都可以消费或生产某类资源,当系统中某一进程使用某一资源时,可以看作是消耗,且该进程称为消费者。而当某个进程释放资源时,则它就相当一个生产者。因此此题可看作是n个生产者和1个消费者问题。顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品)。并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得)。所以可以通过一个有界缓冲区把理发师和顾客联系起来。而其中的信号也具有两种功能:一是跟踪资源的理发师和顾客的计数器;二是协调资源的理发师和顾客之间的同步器。通过对信号进行P、V操作来实现有关问题和相关描述。 数据结构: 信号量: int Custom;//所有到达的顾客,包括正在被理发的顾 客,所以一般情况下,Custom比Wait_Person大1 int Mutex;//用于实现全局变量Wait——preson访问的互斥 int Wait_Leave;//等待离开信号量,用来表示几个顾客等待离开,只要理发师为其理发完毕,他就可以 离开了 全局变量: int * Is_Sleeping;//当前理发师是否在睡觉 函数: void print1(int Wait_person) void print2(int ID) 4:Linux 提供的多线程函数: int pthread_create(pthread_t *—thread,_const pthread_attr_t *attr,void* (*start_rtn)(void*),void *arg); 顾客模块流程图: 3、主程序流程图: 4、PV操作伪代码 int waiting=0 ; //等候理发的顾客数 int chairs=n; //为顾客准备的椅子数 semaphore customers=0, barbers=0,mutex=1; barber() { while(TRUE); //理完一人,还有顾客吗? P(cutomers); //若无顾客,理发师睡眠 P(mutex); //进程互斥 waiting -= 1;//等候顾客数少一个 V(barbers); //理发师去为一个顾客理发 V(mutex); //开放临界区 cut-hair( ); //正在理发 } customer() { P(mutex); //进程互斥 if (waiting) { waiting += 1; // 等候顾客数加1 V(customers); //必要的话唤醒理发师 V(mutex); //开放临界区 P(barbers); //无理发师, 顾客坐着养神 get-haircut( ); //一个顾客坐下等理/ } else V(mutex); //人满了,离开 } 三、测试结果: 代码编辑: 2、编译运行: 3、运行结果: 源代码 #include sys/mman.h #include sys/types.h #include linux/sem.h #include fcntl.h #include unistd.h #include stdio.h #include errno.h #include time.h #define N 5 #define M 20 int Custom; int Mutex; int Wait_Leave; int * Is_Sleeping; void print1(int Wait_person) { if(!Wait_person) { printf(No customer here, go to sleep.\n); *Is_Sleeping=1; } } void print2(int ID) { if(*Is_Sleeping) { printf(New customer %d comes, weak up the barber.\n,ID); *

文档评论(0)

1亿VIP精品文档

相关文档