用C++解决理发师问题

#include<cstdarg>

#include<Windows.h>

#include<iostream>

#include <cmath>

#include<ctime>

#define MAX_COUNT 10//最多理发人数

#define CHAIRS 4//店中椅子的总数目

using namespace std;

intwaiting=0;          //等待理发的顾客人数

char    close_door;          //关门

int     count=0;            //顾客的序号

int     finish=0;           //已经理完发的顾客人数

HANDLE Mutex    =CreateMutex(NULL, FALSE, "Mutex");  //用来实现进程的互斥  

HANDLE barbers   =CreateSemaphore(NULL, 1,1, "barbers"); //定义信号量来进行线程间的同步

HANDLE customers =CreateSemaphore(NULL,0,CHAIRS,"customers"); //定义信号量来进行线程间的同步

int random()//定义随机函数来产生顾客,并使两个顾客间的时间少于10秒

{

srand((int)time(NULL));

return rand()%5000;

}

DWORD WINAPI customer(LPVOID pParm2)// 顾客线程

{

if(ReleaseSemaphore(customers,1,NULL))//V(customer)

{

WaitForSingleObject(Mutex ,INFINITE);

count++;

cout<<"您是第 "<<count<<" 位顾客,欢迎您的到来^_^ "<<endl;

if (waiting!=0)

{

cout<<"现在有"<<waiting <<" 位顾客在等待理发,请您耐心等待^_^"<<endl;

}

else

cout<<"没有顾客在理发,我马上为您服务^_^"<<endl;//输出有多少人在等待

waiting++;

ResumeThread(customers);//唤醒理发师进程

ReleaseMutex(Mutex);//释放互斥量,以便其他线程使用

WaitForSingleObject(barbers,INFINITE);  //等待理发

}

else

{

count++;

cout<<"对不起,没有空椅子……第"<<count<<"个顾客离开理发店"<<endl; //没有椅子,顾客直接离开

}

return 0;

}

DWORD WINAPI barber(LPVOID pParm1)//理发师线程

{

while(true)//外循环

{

WaitForSingleObject(customers,INFINITE);//p(customers),等待顾客

WaitForSingleObject(Mutex,INFINITE);   //等待互斥量

ReleaseSemaphore(barbers,1,NULL);      //释放信号量

ResumeThread(barbers);                 //唤醒顾客进程

Sleep(5000);        //模拟理发 www.bianceng.cn

finish++;                                //理发完毕的顾客数目加1

cout<<"第"<<finish<<"个顾客理发完毕,离开 "<<endl;

waiting--;                             //等待的人数减1

ReleaseMutex(Mutex);                   //v(mutex);

}

return 0;

}

int main( )//实现线程的操作

{

cout<<"***************新店开张,热烈欢迎光大顾客的光临!!***********"<<endl;

cout<<"本店中共有"<<CHAIRS<<"把椅子"<<endl;  

HANDLE hThreadCustomer;

HANDLE hThreadBarder;

hThreadBarder=CreateThread(NULL,0,barber,NULL,0,NULL); //产生一个理发师进程

while(close_door!='y')

{

Sleep(random());//rand()函数实现顾客随机到来

//cout<<endl<<"正在营业,请进!"<<endl;

if (finish>=MAX_COUNT)//如果完成数超过8并且没有人等待

{

while(waiting!=0)

{

Sleep(1000);

continue;

}

cout<<"已经为"<<finish<<"个顾客理发了,是否停止营业?"<<endl; //提示是否关门

cin>>close_door;

if (close_door=='y')

{

cout<<"暂停营业!欢迎下次光临!"<<endl;

system("pause");

return 0;

}

else

{

finish=0;

count=0;

cout<<"继续营业"<<endl;

}

}

hThreadCustomer=CreateThread(NULL,0,customer,NULL,0,NULL);

}

return 0;

}

时间: 2024-11-03 17:56:58

用C++解决理发师问题的相关文章

美发行业,大部分女性的刚需,传统的本地生活代表

美发行业,大部分女性的刚需,传统的本地生活代表.按说市场很大,油水不少. 根据速途研究院公开资料,互联网本地生活服务成交量所占比例中,餐饮美食为37%,休闲娱乐27%,旅游酒店19%,美容美发9%,其余8%.2011年美发营业额为1006亿元,2014年预计为2300亿元,虽然不算爆发式的成长,但是也算是平稳. 然而,在"美发O2O"这个正逐渐被互联网改造的领域中,目前尚没有特别大的投资项目披露,倒是已经有不少鲜活的"死亡"案例.在本文中,我们主要选取自2013年起

《C++多线程编程实战》——2.6 解决典型的IPC问题

2.6 解决典型的IPC问题 进程间通信非常重要,它的实现也很复杂.操作系统的设计人员和开发人员要面临各种问题.接下来,我们讲解一些最常见的问题. 2.6.1 哲学家就餐问题 本节讨论的哲学家就餐问题的定义,选自Andrew S. Tanenbaum所著的Mordern Operating Systems(<现代操作系统>)第三版.作者在书中提供了解决方案. 1965年,Dijkstra提出并解决了一个同步问题,他称之为哲学家就餐问题.这个问题简单地描述如下:5位哲学家围坐在一张圆桌边.每位哲

解决win7系统无法将网页添加到收藏夹的方法

  许多用户在访问网站时,如果看到自己感兴趣的网页内容或网站,通常我们都会通过Ctrl+D添加到收藏夹中,但近期有部分win7系统用户,在浏览器下添加网页收藏时,却发现无法将网页添加到收藏夹,对于这一问题我们如何解决呢?下面看小编为大家提供的详细解决方法吧! 原因分析: 很多时候网址不能收藏都是由于收藏夹目录指向错误引起的,我们可以到注册表里将其修复. 操作方法: 1.在开始菜单中点击"运行",然后输入"regedit"并且回车; 2.打开注册表编辑器,依次展开[H

如何解决win7旗舰版系统下IE收藏夹无法展开的问题

近期朋友在电脑的操作过程中遇到这样一个问题,计算机中的收藏夹突然无法正常展开了,遇到这样的问题令人十分的懊恼.经过多番的研究及测试之后,总算找到了解决计算机中收藏夹无法展开问题的方法.下面就一起来分享看看如何解决win7旗舰版系统计算机中收藏夹无法展开问题吧! 操作方法: 1.使用快捷键win键+r键打开运行窗口,在运行窗口中输入"regedit"回车确认,打开注册表编辑器. 打开注册表编辑器 2.在打开的注册表编辑器中,依次展开到HKEY_CLASSES_ROOTlnkfile. 展

电脑中通过修改注册表解决网页无法添加到收藏夹的方法

  电脑中通过修改注册表解决网页无法添加到收藏夹的方法.最近有不少用户反映在电脑中出现了无法添加网页到收藏夹的问题,尝试了各种方法都无法解决这个问题.对此,在接下来的内容中,小编为大家提供了一种通过修改注册表解决网页无法添加到收藏夹的方法,大家可以参考一下. 1.按Win+R打开运行,输入regedit并按回车键; 2.在注册表编辑器依次展开HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/UserShell

解决win7系统无法进入操作中心的方法教程

  Windows操作中心是一个查看警报和执行操作的中心位置,它可帮助保持 Windows 稳定运行,不过在win7系统下,windows操作中心貌似很少用户会进入查看,不过不能因为我们不经常使用而对其不理不睬,近期有部分使用win7系统的用户向小编反映,在即的windows操作中心无法打开,对于出现该问题的用户我们应该如何解决呢?下面看小编为大家带来的解决方法! 解决win7系统无法进入操作中心的方法教程 1.首先,我们同时按下win7电脑键盘上的win+R快捷键打开电脑的运行窗口,在打开的运

解决win7系统下安全弹出U盘出现电脑重启的问题方法

  U盘是一种能够方便用户便携式存储数据的设备,U盘在我们的生活中较为广泛被使用,不过有些用户在win7系统下使用U盘时进行备份或转移资料后,在不使用U盘时,使用安全弹出U盘时出现电脑自动重启的问题,对于该奇葩问题很多用户表示不解,故此小编针对遇到该问题的用户提供了解决方法,需要的用户赶快试试吧! 解决win7系统下安全弹出U盘出现电脑重启的问题方法 1.返回到桌面位置,找到"这台电脑"图标,直接鼠标右键点击这台电脑,在出现的菜单里面选中选择设备管理器选项. 2.这样就能够打开win8

解决win7系统所有中文显示乱码的方法教程

  在win7系统下我们如果把语言操作系统界面语言修改为英文后,有部分用户的电脑中的英文字体将显示乱码的问题,对于出现该问题是因为中文不是Unicode语言,用户在将系统语言设置为英文后,语言设置的非Unicode设置出问题而导致的,故此我们需要将非Unicode的语言修改为中文语言即可解决这个问题,下面我们看下具体的操作教程吧! 解决win7系统所有中文显示乱码的方法教程 1.点击开始菜单图标并单击打开控制面板. 2.在区域和语言设置-管理中,选择更改显示语言. 3.选择管理标签,并点击更改系

解决win7系统唤醒休眠状态出现“拒绝访问”错误的方法

  windows休眠状态是指将所有运行的实时数据存储到硬盘上,并且关闭一切不必要的硬件从而节省电量,无论你所使用的windows是哪个版本,系统都能够让用户自动进入休眠状态,当然在你没有关闭休眠功能的前提下,不过在近期有部分win7用户反映,将系统从休眠状态唤醒时,出现"拒绝访问"的错误,对于该问题我们如何解决呢?下面看为您带来的解决方法! 解决win7系统唤醒休眠状态出现"拒绝访问"错误的方法 第一步.进入Win7系统后,我们在键盘中按"Win+R&q