#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;
}