基于同步机制的理发师问题(终123)
- 格式:doc
- 大小:300.00 KB
- 文档页数:17
可编辑修改精选全文完整版 职业技能鉴定国家题库 美发师中级理论知识试卷 注 意 事 项 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 ),根据它而感知进程的存在。
实验题目:理发师问问题学号: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文件,在里面声明两个消息队列,当沙发空闲时则会将空闲的消息放入相应的队列中,让顾客可以进入沙发中,当理发师空闲时,也会将相应的消息放入队列中,从而可以让顾客到理发椅上进行理发。
⏹理发师问题:一个理发店由一间等候室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把用来等候理发的椅子。
操作系统--理发师问题正文:一:背景介绍理发师问题是一个经典的并发编程问题,涉及到同时访问共享资源的多个线程之间的同步问题。
该问题的背景可以描述为:在一个理发店里,有一个理发师和一排等待理发的顾客,每个顾客需要等待一段时间才能坐到理发椅上理发。
当有空闲的理发师时,顾客就会坐到椅子上进行理发,否则就需要等待其他顾客理发结束。
该问题需要设计一个合理的算法,保证每个顾客都能够得到理发椅上的理发服务。
二:问题分析1. 线程模型与同步机制考虑到理发师问题涉及到多个顾客同时访问共享资源(理发椅)的情况,可以使用线程模型来解决该问题。
其中,每个顾客作为一个线程,理发椅作为共享资源。
在本问题中,通过使用信号量进行同步机制的设计,保证每个顾客能够按顺序得到理发师的服务。
2. 线程同步的三个要素在解决理发师问题时,需要考虑线程同步的三个要素:互斥、有序性和死锁避免。
互斥可以通过互斥量来实现,保证只有一个线程同时访问共享资源;有序性可以通过信号量来控制,保证顾客能够按照先来后到的顺序进行理发;死锁避免可以通过设置超时等待时间来解决。
三:算法设计1. 初始条件设置首先,需要确定理发师数量、理发椅数量和顾客数量的初始设置。
可以通过命令行参数或配置文件进行设置,以适应不同场景的需求。
2. 创建线程根据顾客数量创建对应数量的线程,并将每个顾客线程的任务设置为等待理发的状态。
同时,创建理发师线程,并将理发师的任务设置为等待顾客的状态。
3. 理发师任务理发师从等待队列中取出一个顾客进行理发,理发时间可以通过随机数。
当该顾客理发结束后,理发师继续从等待队列中取出下一个顾客进行理发。
如果没有顾客在等待,则理发师进入休息状态。
4. 顾客任务顾客到达理发店后,首先判断是否有空闲的理发椅。
如果有空闲的椅子,则顾客坐下并进行理发;否则,顾客需要等待其他顾客离开理发椅后才能进行理发。
5. 同步机制使用互斥量保证理发师和顾客对共享资源的互斥访问。
Linux系统分析实验报告用信号量解决理发师问题061261008 蒋炎岩(一班)1 实验要求理发师问题:理发店理有一位理发师、一把理发椅和5把供等候理发的顾客坐的椅子。
如果没有顾客,理发师便在理发椅上睡觉一个顾客到来时,它必须叫醒理发师,如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。
用Linux线程机制和信号量机制解决这个问题,并且:(1)每个顾客进入理发室后,即时显示“Entered”及其线程标识,还同时显示理发室共有几名顾客及其所坐的位置(2)至少有10个顾客,每人理发至少3秒钟。
(3)多个顾客须共享操作函数代码。
2 背景知识2.1 POSIX线程在一个程序中的多个执行路线称之为线程。
Linux在1996年第一次获得线程支持,现在已经有一套完整的与线程有关的函数库调用,大多数以pthread_开头,编译时需要用-lpthread选项进行连接。
我们用函数pthread_create创建一个新线程:#include <pthread.h>int pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *), void *arg);thread参数表示新线程的标识符;attr用于设置线程属性,如不需要设置,可设置为NULL;start_routine标识了线程启动程序的入口,arg为传入的参数。
调用pthread_create 就可以立即创建一个新的执行路线,与原有线程共享所有的主存空间,但拥有独立的堆栈。
2.2 信号量信号量通过一个计数器控制对共享资源的访问。
如果计数器大于0,则访问被允许,如果为0,则访问被禁止。
计数器计算的结果是允许访问共享资源的通行证。
因此,为了访问共享资源,线程必须从信号量得到通行证(P操作),如果该信号量的计数大于0,则此线程获得一个通行证,这将导致信号量的计数递减,否则,此线程将阻塞直到获得一个通行证为止。
理发师问题的描述:一个理发店接待室有n张椅子,工作室有1张椅子;没有顾客时,理发师睡觉;第一个顾客来到时,必须将理发师唤醒;顾客来时如果还有空座的话,他就坐在一个座位上等待;如果顾客来时没有空座位了,他就离开,不理发了;当理发师处理完所有顾客,而又没有新顾客来时,他又开始睡觉。
现在各种参考书上比较时兴的解决理发师问题的算法大概其就是下边这个算法,不同版本大同小异吧。
var mutex,barber,wakeup:semaphore:=1,0,0;empty:integer:=n+1; //empty表示空座位的数量,接待室加上工作室共n+1个座位beginparbegincustomer:beginwait(mutex); //mutex控制对empty的互斥访问if empty=0 then begin //如果没有空座,顾客走人,不理发了signal(mutex); exit();endelse beginempty:=emtpy-1;if empty=n-1 then beginsignal(wakeup); //如果是第一个顾客,得叫醒理发师signal(mutex);endelse beginsignal(mutex);wait(barber); //第一个顾客不用等待,后续的顾客需要等待理发师腾出手来end理发;end //对应else beginend //customer进程结束barber: beginwait(wakeup); //初始状态,理发师在睡觉,一旦被唤醒,就进入下边这个无限循环repeat理发; //被唤醒了,直接给第一个顾客理发wait(mutex); //收拾完一个,要修改空座的数量,争夺empty的控制权empty:=empty+1;if empty <n then begin //empty <n表示还有等着的顾客signal(barber); //表示理发师腾出手来了signal(mutex);endelse beginsignal(mutex);wait(wakeup); //没顾客了,睡觉去,等待唤醒end //对应else beginuntil false;end //barber进程结束parendend我感觉这个算法有点问题,因为customer进程中的“理发”语句和barber进程中的“理发”语句并不同步,当两个进程进入执行这两个语句的状态时,实际上已经失去了同步性。
操作系统课程设计任务书操作系统设计说明书学院名称:计算机与信息工程班级名称:计算机科学与技术学生姓名:学号: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;。