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);                               //模拟理发

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;

}

 

本文转自 chenming421  51CTO博客,原文链接:http://blog.51cto.com/wnqcmq/1093356


相关文章
|
定位技术 C++
C++实现俄罗斯方块(附代码)
C++实现俄罗斯方块(附代码)
C++实现俄罗斯方块(附代码)
|
机器学习/深度学习 C++
C++实现实现逆时针旋转矩阵
C++实现实现逆时针旋转矩阵
C++实现实现逆时针旋转矩阵
|
编译器 C++ 容器
【C++要笑着学】迭代器适配器 | 内嵌类型实现反向迭代器 | 迭代器萃取
上一章讲解 list 模拟实现时,我们简单的提到了反向迭代器,我们说反向迭代器其实就是对正向迭代器的一种封装 —— 适配器模式(配接器模式)。当时我们做的是简单的了解,本章我们就来探讨这一部分的知识。
208 1
【C++要笑着学】迭代器适配器 | 内嵌类型实现反向迭代器 | 迭代器萃取
|
算法 区块链 C++
【C++要笑着学】vector 核心框架接口的模拟实现 | 基于STL3.0版本的简化vector | 浅谈迭代器失效问题(二)
STL 的源代码整体考虑的东西比较多,还要考虑和其他地方的结合,因此整体的设计是比较复杂的。基于这一系列原因,我们会以简单的形式去实现其核心框架接口,方便去学习 vector。
143 1
【C++要笑着学】vector 核心框架接口的模拟实现 | 基于STL3.0版本的简化vector | 浅谈迭代器失效问题(二)
|
存储 测试技术 区块链
【C++要笑着学】vector 核心框架接口的模拟实现 | 基于STL3.0版本的简化vector | 浅谈迭代器失效问题(一)
STL 的源代码整体考虑的东西比较多,还要考虑和其他地方的结合,因此整体的设计是比较复杂的。基于这一系列原因,我们会以简单的形式去实现其核心框架接口,方便去学习 vector。
171 1
【C++要笑着学】vector 核心框架接口的模拟实现 | 基于STL3.0版本的简化vector | 浅谈迭代器失效问题(一)
|
存储 C++
C++异常处理机制由浅入深, 以及函数调用汇编过程底层刨析. C++11智能指针底层模拟实现
C++异常处理机制由浅入深, 以及函数调用汇编过程底层刨析. C++11智能指针底层模拟实现
C++异常处理机制由浅入深, 以及函数调用汇编过程底层刨析. C++11智能指针底层模拟实现
|
存储 Linux C语言
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
|
设计模式 安全 定位技术
C++从面试常考实现特殊类到单例模式的实现
C++从面试常考实现特殊类到单例模式的实现
C++从面试常考实现特殊类到单例模式的实现
|
存储 Java 应用服务中间件
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
线程池设计, 从简单的我们平常设计线程池图解,到生活中的类似线程池的处理现实场景, 到简单的C++模拟nginx写的单链表组织工作队列的简单线程池实现 + nginx 部分源码刨析
如何用c++实现异常处理
如何用c++实现异常处理
如何用c++实现异常处理