基于同步机制的理发师问题(终123)

合集下载

美发师职业技能鉴定国家题库精选全文

美发师职业技能鉴定国家题库精选全文

可编辑修改精选全文完整版 职业技能鉴定国家题库 美发师中级理论知识试卷 注 意 事 项 1、考试时间:120分钟。

2、本试卷依据2001年颁布的《美发师 国家职业标准》命制。

3、请首先按要求在试卷的标封处填写您的姓名、准考证号和所在单位的名称。

4、请仔细阅读各种题目的回答要求,在规定的位置填写您的答案。

5、不要在试卷上乱写乱画,不要在标封区填写无关的内容。

一 二 总 分 得 分 得 分 评分人 一、单项选择(第1题~第120题。

选择一个正确的答案,将相应的字母填入题内的括号中。

) 1. 人类社会生活可分为三大领域,即( )、社会公共生活和职业生活。

A 、社会主义阶段生活 B 、家庭生活 C 、学校生活 D 、共产主义阶段生活 2. 社会发展和生产技术进步产生了社会分工。

由于社会分工不同,因而不同职业有着不同的( ),这是职业道德产生的历史过程。

A 、技术设备 B 、职业责任和职业纪律 C 、从业人员 D 、生产结果 3. 美发师对自己所从事的职业要充满自信,对工作要()。

A 、态度和蔼 B 、顾客至上 C 、重视仪表 D 、认真负责 4. 美发师职业道德的特点是以人为本、以等价交换为原则,为顾客提供( )。

A 、知识 B 、劳务 C 、技术 D 、业务 5. 美发师职业道德的主要行为规范是热爱本职、认真负责,积极主动、热情服务,()。

A 、努力创收、效益第一 B 、技术高超、不传外人 C 、发式新潮、服饰出众 D 、举止文明、谦虚谨慎 6. 美发师在美发操作过程中,应随时听取顾客的反映,如洗发时水温的冷热、按摩时( )等。

A 、发质的好坏 B 、洗发水的多少 C 、力度的大小 D 、梳子的长短 7. 美发师讲究个人卫生是非常重要的,因此,在工作中必须做到“()”和“四坚持”。

A 、三勤 B 、四勤 C 、五勤 D 、六勤 8. 温度应为100℃,持续15分钟,这种对棉织品消毒的有效的方法是( )。

计算机操作系统(习题集)第二章 答案

计算机操作系统(习题集)第二章 答案

第二章进程管理一、单项选择题1、在单一处理机上执行程序,多道程序的执行是在(B)进行的。

A.同一时刻B. 同一时间间隔内C.某一固定时刻D. 某一固定时间间隔内2、引入多道程序技术后,处理机的利用率( C)。

A.降低了B. 有所改善C.大大提高D. 没有变化,只是程序的执行方便了3、顺序程序和并发程序的执行相比,( C)。

A.基本相同 C.并发程序执行总体上执行时间快B. 有点不同 D.顺序程序执行总体上执行时间快4、单一处理机上,将执行时间有重叠的几个程序称为(C )。

A.顺序程序B. 多道程序C.并发程序D. 并行程序5、进程和程序的本质区别是(D )。

A.存储在内存和外存 B.顺序和非顺序执行机器指令C.分时使用和独占使用计算机资源D.动态和静态特征6、进程就是程序在并发环境中的执行过程,它是系统进行资源分配和调度的一个基本单位。

进程具有[1A]、[2D]、调度性、异步性和结构性等基本特征。

进程是一次执行过程,具有生命期体现了进程的[1]特征。

进程由程序段、[3B]、[4C]组成,其中[4]是进程在系统中存在的唯一标识。

供选择的答案:[1][2] :A、动态性 B、静态性 C、共行性 D、并发性 E、可执行性 F、易用性[3] :A、过程 B、数据 C、进程标识符 D、函数[4] :A、FCB B、FIFO C、PCB D、JCB7、进程执行时的间断性,决定了进程可能具有多种状态。

进程的基本状态有三种,在分时系统中,当一个进程拥有的时间片到时,则该进程即由[1D]进入[2A]。

如果出现因某种原因使得处理机空闲时,则需要从就绪队列中选择一进程,并将处理机分配给它,此时该进程进入[3D],这个过程是由[4C]来完成。

供选择的答案:[1][2][3] :A、就绪状态 B、静止状态 C、阻塞状态 D、运行状态[4] :A、进程控制程序B、资源分配程序C、进程调度程序 D、处理机分配程序8、为了描述进程的动态变化过程,采用了一个与进程相联系的(C ),根据它而感知进程的存在。

计算机操作系统作业2(含答案)资料

计算机操作系统作业2(含答案)资料
11.何为死锁?产生死锁的原因和必要条件是什么?比较三种解决死锁的方法?
12.试比较说明进程和程序的区别有哪些?
三、应用题
1.有一个理发师,一把理发椅和n把供等候理发的顾客坐的椅子。如果没有顾客,则理发师便在理发椅子上睡觉;当一个顾客到来时,必须唤醒理发师,进行理发;如果理发师正在理发时,又有顾客来到,则如果有空椅子可坐,他就坐下来等,如果没有空椅子,他就离开。为理发师和顾客各编一段程序描述他们的行为,要求不能带有竞争条件。
9.银行家算法在解决死锁问题中是用于______的。
A.预防死锁B.避免死锁C.检测死锁D.解除死锁
10.______不是进程调度算法。
A.时间片轮转法B.先来先服务方法
C.响应比高者优先法D.均衡调度算法
11.下面关于线程的叙述中正确的是______。
A.线程包含CPU现场,可以独立执行程序B.每个线程有自己独立的地址空间
28.进程控制块PCB不包括的内容是______。
A.CPU现场B.进程优先级C.进程运行状态D.文件缓冲区
29.PCB是描述进程状态和特性的数据结构,一个进程______。
A.可以有多个PCBB.可以和其他进程共用一个PCB
C.可以没有PCBD.只能有唯一的PCB
30.资源顺序分配法破坏了死锁发生的______必要条件。
A.互斥关系B.同步关系C.互斥和同步D.无制约关系
7.在优先级调度中,______类进程可能被“饿死”,即长时间得不到调度。
A.短进程B.长进程C.低优先级进程D.大内存进程
8.进程从运行状态到阻塞状态可能是由于______。
A.进程调度程序的调度B.现运行进程的时间片耗尽
C.现运行进程执行了wait操作D.现运行进程执行了signal操作

操作系统实验五 理发师问题

操作系统实验五 理发师问题

实验题目:理发师问问题学号:201000130133 班级: 2010级计算机4班姓名:郑思雨 Email:1412561943@实验目的:1、进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法。

2、加深对于非对称性互斥问题有关概念的理解。

观察和体验非对称性互斥问题的并发控制方法。

3、进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。

硬件环境:微机(多核,4GB 以上内存,320GB 以上硬盘)软件环境:Ubuntu-Linux 操作系统Gnome 桌面gcc version 4.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1、了解实验的目的,了解并掌握与进程间通信IPC中的3个对象:共享内存、信号灯数组、消息队列到呢个有关的系统调用,并能熟练的掌握。

2、阅读实验题目并分析实验的需求。

理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。

此外还有一间等候室,可容纳13位顾客等候进入理发室。

顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。

在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。

顾客理完发后,可向任何一位理发师付款。

但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。

理发师在没有顾客的时候就坐在理发椅子上睡眠。

理发师的时间就用在理发、收款、睡眠上。

(1)首先创建ipc.h文件,在里面定义生产者/消费者共用的IPC函数的原型和变量。

(2)然后创建ipc.c文件,在里面定义生产者/消费者共用的IPC 的具体的相应函数。

(3)创建sofa_control文件,在里面声明两个消息队列,当沙发空闲时则会将空闲的消息放入相应的队列中,让顾客可以进入沙发中,当理发师空闲时,也会将相应的消息放入队列中,从而可以让顾客到理发椅上进行理发。

系统调用中的信号量PV操作 理发师问题

系统调用中的信号量PV操作 理发师问题

⏹理发师问题:一个理发店由一间等候室W和一间工作室B组成。

顾客可以从外面大街上进入W等候理发。

两个房间的入口是并排的,且共享一扇日本式可滑动的推拉门(门总是挡住一个入口)。

顾客在工作室内理完发,可由B 的旁门出去。

W中有N把椅子,顾客必须坐着等候。

理发师可由门上小窗查看W中无人就睡觉,否则开门,并叫一位顾客入内理发。

顾客每进入一位,都拉铃通知理发师。

若把顾客和理发师都视为进程,请用P、V操作写出进程的同步算法。

⏹要求打印:题目中要求描述理发师和顾客的行为,因此需要两类线程barber()和customer ()分别描述理发师和顾客的行为。

其中,理发师有活动有理发和睡觉两个事件;等待和理发二个事件。

店里有固定的椅子数,上面坐着等待的顾客,顾客在到来这个事件时,需判断有没有空闲的椅子,理发师决定要理发或睡觉时,也要判断椅子上有没有顾客。

所以,顾客和理发师之间的关系表现为:(1)理发师和顾客之间同步关系:当理发师睡觉时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师睡觉。

(2)理发师和顾客之间互斥关系:由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n把,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。

(3)故引入3个信号量和一个控制变量:ⅰ控制变量waiting用来记录等候理发的顾客数,初值为0;ⅱ信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;ⅲ信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为1;ⅳ信号量mutex用于互斥,初值为1using System;using System.Collections.Generic;using System.Text;using System.Threading;namespace理发师问题2{internal class Program{// Fieldsprivate static Semaphore barbers = new Semaphore(1, 10);private static int chairs;private static int count = 0;private static Semaphore customers = new Semaphore(0, 10);private static int finish = 0;private static Semaphore mtx = new Semaphore(1, 10);private static int waiting = 0;// Methodspublic static void barber(){while (true){customers.WaitOne();mtx.WaitOne();waiting--;barbers.Release();mtx.Release();cuthair();finish++;}}public static void customer(){mtx.WaitOne();count++;Console.WriteLine("叮咚!第{0}个顾客来了", count);if (waiting < chairs){if (waiting > 0){Console.WriteLine("此时有{0}个人在等待理发", waiting);}else{Console.WriteLine("没有人在等待");}waiting++;Console.WriteLine("还有{0}个座位,顾客留下", (chairs - waiting) + 1);mtx.Release();customers.Release();barbers.WaitOne();gethaircut();}else{Console.WriteLine("座位已满,第{0}个顾客离开", count); mtx.Release();}}public static void cuthair(){Console.WriteLine("开始理发!这是理发师的第{0}个顾客.", finish + 1);Thread.Sleep(0x2328);Console.WriteLine("理发完成 !");}public static void gethaircut(){Thread.Sleep(0x238c);Console.WriteLine("第{0}个顾客理发完毕,离开.", finish);}private static void Main(string[] args){string str = string.Empty;Console.WriteLine("请输入椅子的总数目:");chairs = Convert.ToInt32(Console.ReadLine());Console.WriteLine("理发店共有{0}把椅子", chairs);Console.WriteLine("开门接待顾客吗?Y/N");for(string str2 = Console.ReadLine(); (str2 != "Y") && (str2 != "y"); str2 = Console.ReadLine()){Console.WriteLine("********对不起,尚未开门!********");Console.WriteLine("开门接待顾客吗?Y/N");}Console.WriteLine("********营业中,欢迎光临!********");new Thread(new ThreadStart(Program.barber)).Start();while ((str != "y") && (str != "Y")){Random random = new Random(lisecond);Thread.Sleep(random.Next(1, 0x2710));Console.WriteLine("*******************************");new Thread(new ThreadStart(Program.customer)).Start();if ((finish >= 10) && (waiting == 0)){Console.WriteLine("已经为{0}个顾客理发了,要关门下班吗?(Y/N)", finish);str = Console.ReadLine();}if ((str == "Y") || (str == "y")){Console.WriteLine("************暂停营业!**********");break;}}}}}题目: 用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem)理发店有一位理发师,一把理发椅和n把用来等候理发的椅子。

操作系统原理课件-第十一讲睡眠理发师问题

操作系统原理课件-第十一讲睡眠理发师问题
死锁问题:原因,条件,解决方法;银行家算法
线程:引入原因,与进程比较
处理机调度:分为几个层次(作业调度、中级调度、进程调度); 评价调度算法的指标;调度算法各自的特点;采用不同的算法 计算进城的周转时间、调度顺序等;实时调度概念、常见算法
V(seat);
Get_haircut(); }
Process barber {
While(1)
{
P(customers); //接收顾客信号
V(barbers);//向顾客发信号
Cut_hair();
}
}
睡眠理发师问题 方法3
#define CHIRS=5
Var customers,barbers,mutex: Semaphore:=0,0,1
{
P(customers); //接收顾客信号
Cut_hair();
V(seat);
}
}
睡眠理发师问题 方法2
Var customers,barbers,seat: Semaphore:=0,0,5
Process customer
{
P(seat) ;
V(customers); //向理发师发信号
P(barbers); //接收理发师信号
P(customers );//接收顾客信号
Get_haircut();
P(mutex);}Fra bibliotekwaiting=waiting-1;
else
V(barbers);//向顾客发信号
{
V(mutex);
V(mutex);
Cut hair();
}
}
}
}
练习
吸烟者问题(1971,Patil):在一个房间内有三位吸烟者、一位材 料供应者。其中: a) 吸烟者: 需要拥有三种材料“烟草(Tobacco)、卷烟纸 (Cigarette-paper)、火柴(Match)”才能吸烟: 第一位吸烟者有丰富的烟草; 第二位吸烟者有丰富的卷烟纸; 第三位吸烟者有丰富的火柴; ; 当吸烟者拿到所需要的材料后,唤醒供应者进行下一次投放; b) 材料供应者:不吸烟,且有丰富的Tobacco、Cigarette-paper、 Match三种材料; 每次随机地将三种材料中的两种投放到桌子上; 允许拥有另一种材料的吸烟者吸烟。 【要求】编写算法用信号量和P、V操作实现它们之间的同步关系。

实例:同步问题

实例:同步问题

同步问题2:理发师问题
var waiting : integer:=0; /*等候理发的顾客数*/ CHAIRS:integer:=n; /*为顾客准备的椅子数*/ VAR customers, barbers,mutex : semaphore:=0,0,1; Procedure barber; begin while(TRUE); /*理完一人,还有顾客吗?*/ P(cutomers); /*若无顾客,理发师睡眠*/ P(mutex); /*进程互斥*/ waiting := waiting – 1; /*等候顾客数少一个*/ V(barbers); /*理发师去为一个顾客理发*/ V(mutex); /*开放临界区*/ cut-hair( ); /*正在理发*/ end;
同步问题2:理发师问题



互斥信号量:mutex ,初始值为1; 信号量customers用来记录等候理发的顾客 数,并用作阻塞理发师进程,初值为0; barbers用来记录正在等候顾客的理发师数, 并用作阻塞顾客进程,初值为0; 这里barbers只有两种取值, 0或1; 临界变量:waiting由理发师进程和顾客进程 共同访问,用来记录在椅子上等着的顾客数;
同步问题3



Void mather() { Wait(empty); wait(mutex); put an orange on the disk; signal(mutex); signal(orange); }
同步问题3



Void son() { Wait(apple); Wait(mutex); Get an apple from disk; Signal(mutex); Signal(empty); }

操作系统--理发师问题

操作系统--理发师问题

操作系统--理发师问题正文:一:背景介绍理发师问题是一个经典的并发编程问题,涉及到同时访问共享资源的多个线程之间的同步问题。

该问题的背景可以描述为:在一个理发店里,有一个理发师和一排等待理发的顾客,每个顾客需要等待一段时间才能坐到理发椅上理发。

当有空闲的理发师时,顾客就会坐到椅子上进行理发,否则就需要等待其他顾客理发结束。

该问题需要设计一个合理的算法,保证每个顾客都能够得到理发椅上的理发服务。

二:问题分析1. 线程模型与同步机制考虑到理发师问题涉及到多个顾客同时访问共享资源(理发椅)的情况,可以使用线程模型来解决该问题。

其中,每个顾客作为一个线程,理发椅作为共享资源。

在本问题中,通过使用信号量进行同步机制的设计,保证每个顾客能够按顺序得到理发师的服务。

2. 线程同步的三个要素在解决理发师问题时,需要考虑线程同步的三个要素:互斥、有序性和死锁避免。

互斥可以通过互斥量来实现,保证只有一个线程同时访问共享资源;有序性可以通过信号量来控制,保证顾客能够按照先来后到的顺序进行理发;死锁避免可以通过设置超时等待时间来解决。

三:算法设计1. 初始条件设置首先,需要确定理发师数量、理发椅数量和顾客数量的初始设置。

可以通过命令行参数或配置文件进行设置,以适应不同场景的需求。

2. 创建线程根据顾客数量创建对应数量的线程,并将每个顾客线程的任务设置为等待理发的状态。

同时,创建理发师线程,并将理发师的任务设置为等待顾客的状态。

3. 理发师任务理发师从等待队列中取出一个顾客进行理发,理发时间可以通过随机数。

当该顾客理发结束后,理发师继续从等待队列中取出下一个顾客进行理发。

如果没有顾客在等待,则理发师进入休息状态。

4. 顾客任务顾客到达理发店后,首先判断是否有空闲的理发椅。

如果有空闲的椅子,则顾客坐下并进行理发;否则,顾客需要等待其他顾客离开理发椅后才能进行理发。

5. 同步机制使用互斥量保证理发师和顾客对共享资源的互斥访问。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统课程设计任务书操作系统设计说明书学院名称:计算机与信息工程班级名称:计算机科学与技术学生姓名:学号:2011211245 2011211240 2011211204 2011211238 2011211249 2011211243 题目:基于同步机制的理发师问题指导教师:起止日期: 2013年6月3日~2013年6月30日目录1 选题背景 (5)2 设计理念 (5)3 过程论述 (6)3.1 函数解释 (6)3.2 概要设计 (7)3.2.1 主函数模块 (7)3.2.2 理发师进程模块 (7)3.2.3 顾客进程模块 (8)3.3 详细设计和代码 (9)3.3.1 PV操作伪代码 (9)3.3.2 理发师进程模块代码 (10)3.3.3 顾客进程模块代码 (10)4 结果分析 (11)5 设计总结 (12)6 参考文献 (13)7 附录 (13)1 选题背景在操作系统理论中有一个非常重要的概念叫做P,V原语。

在我们研究进程间的互斥的时候经常会引入这个概念,将P,V操作方法,来解决进程间的互斥问题。

实际上,P、V原语的应用范围很广,不但可以解决进程同步与进程通信的问题而且我们还可以利用此方法解决进程管理当中的互斥问题。

那么操作系统中是如何实现P、V操作的呢?下面我们通过一个例子来说明。

wait(S): while S<=0 do no-op;S:=S- 1;signal(S): S:=S+1;说明:wait(S)和signal(S)是两个原子操作,因此,它们在执行时是不可中断的。

亦即,当进程在修改某信号量时,没有其他进程可同时对该信号量进行修改。

此外,在wait操作中,对S值得测试和做S:=S-1操作时都不可中断。

理发师问题可以理解为经典进程同理发师问题可以理解为经典进程同步问题的一个具体问题,可以使用P、V操作解决理发师和顾客之间的同步问题。

2 设计理念假设有家理发店,店里有一个理发师、一把理发椅和n把等候理发的顾客椅子。

理发过程如下:如果没有顾客则理发师便睡觉。

当有一个顾客到达时,首先查看理发师在干什么,如果在睡觉则唤醒理发师理发,然后坐到理发椅上开始理发;如果理发师正在理发,则查看是否有空的椅子可坐,如果有,他就坐下等待,如果没有,则离开;理发师为一位顾客理完发后,查看是否有人等待,如有则唤醒一位为其理发,如没有则在理发椅上睡觉。

(顾客不分优先级)。

此题可看作是n个生产者与一个消费者问题。

顾客作为生产者,每来到一个就使计数器count增加1,以便让理发师(相当于消费)至最后一个顾客(相当于产品)。

并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消费可有计数器count获得)。

主要有以下一些函数来实现整个问题的实现过程:⑴用随机函数random()来生产进入理发店的顾客。

(2)用顾客线程customer实现对顾客行为的控制。

(3)用理发师线程barber实现对理发师行为的控制。

(4)定义主函数main来实现两个线程的控制和执行操作。

3 过程论述3.1 函数解释WINAPI函数:调用约定,WINAPI即stdcall,有加WINAPI的函数基本可以说明系统将在某个时候会自己调用这个函数,里面的参数LPVOID pParm是用来在下面的(hThreadCustomer=CreateThread(NULL,0,customer,NULL,0,NULL))创建线程时传递参数的。

传递的是第五个参数。

hThreadCustomer=CreateThread(NULL, // 没有安全描述符0, // 默认线程栈的大小customer, // 线程函数指针NULL, // 没有附加属性0, // 传递参数(LPVOID)&nNULL // 不需要获得线程号码);WaitForSingleObject函数:⑴ WaitForSingleObject(barbers,INFINITE); //等待理发⑵ WaitForSingleObject(Mutex,INFINITE);//等待互斥量⑶WaitForSingleObject(customers,INFINITE);//p(customers)等待顾客该函数用来检测Handle事件的信号状态,当函数的执行时间超过dwMilliseconds就返回,但如果参数dwMilliseconds为INFINITE时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到WaitForSingleObject有返回直才执行后面的代码。

ReleaseSemaphore函数:⑴ ReleaseSemaphore(barbers,1,NULL);//释放信号量⑵ ReleaseSemaphore(customers,1,NULL)该函数用于对指定的信号量增加指定的值。

ResumeThread线程恢复函数;⑴ ResumeThread(barbers); //唤醒顾客进程;⑵ ResumeThread(customers);//唤醒理发师进程ReleaseMutex函数:⑴ ReleaseMutex(Mutex);//v(mutex);⑵ ReleaseMutex(Mutex);//释放互斥量,以便其他线程使用该函数释放由线程拥有的一个互斥体。

3.2 概要设计程序由三部分组成:主函数模块、理发师进程模块和顾客进程模块。

3.2.1 主函数模块在主程序模块中,主要实现线程的操作。

开始创建理发师线程,当有顾客到来时,在创建顾客线程来实现对顾客的操作,即开始理发,当顾客全部理发完成时,判定理发师是否关门,如果是,则结束理发师线程,程序结束;如果不是,则理发师线程继续操作,直到结束。

主程序如图3-1所示。

图3-1 主程序流程图3.2.2 理发师进程模块在理发师模块中,但有顾客来的时候,理发师线程开始申请顾客信号量,顾客减一,理发师理发,释放理发师信号量。

如果没有顾客直接释放理发师信号量。

图3-2 理发师模块流程图3.2.3 顾客进程模块在顾客模块中,当一个顾客来的时候,判断顾客人数要小于椅子数,如果没有空椅子顾客离去,如果有空椅子,顾客等待且顾客人数加1,释放顾客信号量,等待理发师理发。

图3-3 顾客模块流程图3.3 详细设计和代码3.3.1 PV操作伪代码理发师和顾客的进程之间是同步的,利用customer,barbers,mutex三个信号量来实现进程互斥。

对于顾客,顾客到来和顾客在理发是互斥的,对于理发师,理发师理发和理发师睡眠时互斥的。

通过成对出现的P和V操作实现。

具体伪代码如下:int waiting=0 ; //等候理发的顾客数int chairs=n; //为顾客准备的椅子数semaphore customers=0, barbers=0,mutex=1;//申明3个信号量barber(){while(TRUE); //理完一人,还有顾客吗?P(cutomers); //若无顾客,理发师睡眠P(mutex); //进程互斥waiting := waiting - 1; //等候顾客数少一个V(barbers); //理发师去为一个顾客理发V(mutex); //开放临界区cut-hair( ); //正在理发}customer(){P(mutex); //进程互斥if (waiting){waiting := waiting+1; // 等候顾客数加1V(customers); //必要的话唤醒理发师V(mutex); //开放临界区P(barbers); //无理发师, 顾客坐着养神get-haircut( ); //一个顾客坐下等理/}elsep(mutex); //人满了,离开! }3.3.2 理发师进程模块代码理发师进程主要是在理发师为一个顾客理发完成时,理发完毕的顾客数加一,等待理发的顾客数减一。

其代码如下:DWORD WINAPI barber(LPVOID pParm1)//理发师线程{while(true){WaitForSingleObject(customers,INFINITE);//p(customers)等待顾客 WaitForSingleObject(Mutex,INFINITE);//等待互斥量ReleaseSemaphore(barbers,1,NULL);//释放信号量ResumeThread(barbers); //唤醒顾客进程;sleep(2000); //模拟理发(来源于#include<ctime>)finish++; //理发完毕的顾客数目加1cout<<"第"<<finish<<"个顾客理发完毕,离开 "<<endl;waiting--; //等待的人数减1ReleaseMutex(Mutex); //v(mutex);}return 0;}3.3.3 顾客进程模块代码顾客进程是当理发师睡眠时唤醒进行理发,理发师正在进行理发时等待。

如果没有等待的椅子则直接离开。

具体代码如下:DWORD WINAPI customer(LPVOID pParm2)// 顾客线程{if(ReleaseSemaphore(customers,1,NULL))//V(customer){WaitForSingleObject(Mutex ,INFINITE);count++;cout<<"您是第 "<<count<<" 位顾客,欢迎您"<<endl;if (waiting!=0)//(waiting来源于WaitForSingleObject){cout<<"现在有"<<waiting <<" 位顾客在等待理发,请您耐心等待"<<endl;。

相关文档
最新文档