1、目目 录录 1. 课程设计内容课程设计内容.2 2. 课程设计目的课程设计目的.2 3. 开发环境开发环境.2 4. 设计步骤与方法设计步骤与方法.2 4.1. 程序概要设计. 2 4.2. 程序详细设计. 3 5. 设计结果及分析设计结果及分析.5 6. 设计结论设计结论.7 7. 对本设计过程及方法、手段的改进建议对本设计过程及方法、手段的改进建议 7 8. 任务分配任务分配.7 9. 参考文献参考文献.7 10. 课程设计评价课程设计评价(教师教师) 7 第 2 页 共 7 页 理发师问题理发师问题 1. 课程设计课程设计内容内容 理发店有一位理发师,一把理发椅和 n 把等候理发的顾客座
2、位。如果没有 顾客,理发师便看报纸,有顾客来时,他必须叫理发师。如果理发师正在理发时 又有顾客来到,如果等候室有座位,就坐下等待,否则离开。 2. 课程设计目的课程设计目的 通过生产者和消费者问题的设计和调试,使学生掌握进程同步的工作原理, 利用信号量的原理和机制去解决同步问题, 并培养学生分析和解决实际问题的能 力。 3. 开发环境开发环境 系统:windows 2000/windows XP 语言:C# 软件开发工具:visual studio 2008 4. 设计设计步骤步骤与与方法方法 4.1. 程序程序概要设计概要设计 设计一个 windows 应用窗口来模拟理发师问题这个实验, 分
3、等候室、 工作室 两块区域。等候室有 5 个位置,工作室有理发师和正在理发的顾客。人物分顾客 和理发师两种,理发师只有一个,顾客初始设定为 10 人。 第 3 页 共 7 页 4.2. 程序详细设计程序详细设计 4.2.1 界面设计界面设计 首先创建一个 C#项目工程并命名为 BarberQuestion。在 BarberQuestion 项目 中创建 startform.cs,程序开始界面. 如下图示: 图 1:开始窗口 然后创建一个主界面命名为 mainForm.cs. 如下图示: 图 2:主窗口 第 4 页 共 7 页 4.2.2 代码设计代码设计 首先创建两个队列来装载顾客分别是: p
4、rivate Queue enqueueIndex = new Queue(); /创建一个存储队列 private Queue dequeueIndex = new Queue(); /创建一个离开队列 开始模拟按钮开始模拟按钮:实现模拟顾客进入发厅等候室,当等候室没有位子时,离 开; 通知理发师按钮通知理发师按钮:实现当等候室有顾客时,通知理发师为顾客理发。 实现代码: / / 通知理发师 / private void btnWakeBarber_Click(object sender, EventArgs e) if (dequeueIndex.Count != 0) picBaber.
5、Show(); this.btnStartBarber.Enabled = true; else MessageBox.Show(“由于没有顾客等待理发,所以不必通知理发师!“); picBaber.Hide(); this.btnStartBarber.Enabled = false; picBaber.Image = Image.FromFile(“Images“ + 11 + “.bmp“);/理发师的图片 this.btnWakeBarber.Enabled = false; 开始开始理发理发按钮按钮:实现模拟理发师为顾客理发;等候室的顾客减一,顾客进 入工作室理发; 理发完成理发完成
6、按钮按钮:模拟理发过程结束。 实现代码: / / 剪发完成 / private void btnEndBarber_Click(object sender, EventArgs e) System.Threading.Thread.Sleep(300); this.picBarbering.Hide(); 第 5 页 共 7 页 this.btnStartBarber.Enabled = true; MessageBox.Show(“理发完成!“); this.btnEndBarber.Enabled = false; 5. 设计设计结果结果及及分析分析 点击开始模拟按钮顾客进入发厅等候; 点击通知理发师按钮; 第 6 页 共 7 页 点击开始理发按钮; 点击理发完成按钮; 分析:分析: 运行结果基本正确,有时会出现错误。程序中运行结果基本正确,有时会出现错误。程序中顾客为互斥的关系,理发师和顾客为互斥的关系,理发师和 工作室的椅子是临界资源,采用工作室的椅子是临界资源,采用用两个队列来承载顾客,用