用线程实现
//----------------------------动作函数申明------------------------------
void DriverStartup();//司机启动
void DriverRun();//司机行车
void DriverStop();//司机停车
void BusmanUp();//售票员上客
void BusmanClose();//售票员关门
void BusmanSell();//售票员售票
void BusmanOpen();//售票员开门
void BusmanDown();//售票员下乘客
//----------------------------动作函数定义------------------------------
void DriverStartup(){
P(action,hDriver);
cout<<"司机动作:启动汽车."<<endl;
WAIT;
V(action,hBusman);
}
void DriverRun(){
P(action,hDriver);
cout<<"司机动作:正常行车."<<endl;
WAIT;
V(action,hBusman);
}
void DriverStop(){
P(action,hDriver);
cout<<"司机动作:停止行车."<<endl;
WAIT;
V(action,hBusman);
}
void BusmanUp(){
P(action,hBusman);
cout<<"售票员动作:乘客上车."<<endl;
WAIT;
V(action,hDriver);
}
void BusmanClose(){
P(action,hBusman);
cout<<"售票员动作:关闭车门."<<endl;
WAIT;
V(action,hDriver);
}
void BusmanSell(){
P(action,hBusman);
cout<<"售票员动作:售票."<<endl;
WAIT;
V(action,hDriver);
}
void BusmanOpen(){
P(action,hBusman);
cout<<"售票员动作:打开车门."<<endl;
WAIT;
V(action,hDriver);
}
void BusmanDown(){
P(action,hBusman);
cout<<"售票员动作:乘客下车."<<endl;
WAIT;
V(action,hDriver);
}
#include<iostream>
#include<windows.h>
#include<conio.h>
#define WAIT Sleep(1000)//----------------------动作间隔--------------------------
using namespace std;
//--------------------信号量的定义------------------------------------------------
typedef int Semaphore;//信号量数据类型定义
//变量定义
HANDLE hDriver;//司机线程的句柄
HANDLE hBusman;//售票员线程的句柄
DWORD dwDriverId, dwDriverParam = 1;//线程信息
DWORD dwBusmanId, dwBusmanParam = 1;//线程信息
Semaphore run = 0;//表示是否可以开车/是否售票完成
Semaphore stop = 0;//表示是否可以开门/是否停车完成
Semaphore action = 1;//表示是否可以做出动作/防止两个线程(进程)同时做出动作(导致输出混乱)
#include"PV.h"
#include"action.h"
//--------------------------线程回调函数--------------------------------
DWORD WINAPI Driver( LPVOID lpParam ) //Driver线程回调函数
{
do{
P(run,hDriver);//P操作/申请run信号量
DriverStartup();//启动
DriverRun();//行车
DriverStop();//停车
V(stop,hBusman);//V操作/申请stop信号量
}while(1);
return 0;
}
DWORD WINAPI Busman( LPVOID lpParam ) //Busman线程回调函数
{
do{
BusmanUp();//上乘客
BusmanClose();//关门
V(run,hDriver);//V操作/释放run信号量
BusmanSell();//售票
P(stop,hBusman);//P操作/申请stop信号量
BusmanOpen();//开门
BusmanDown();//下乘客
}while(1);
return 0;
}
//---------------------------主函数-------------------------------
int main()
{
//线程创建
hDriver = CreateThread(NULL,0,Driver,&dwDriverParam,0,&dwDriverId);//创建Driver进程
hBusman = CreateThread(NULL,0,Busman,&dwBusmanParam,0,&dwBusmanId);//创建Busman进程
_getch();
return 0;
}
//--------------------信号量的定义------------------------------------------------
typedef int Semaphore;//信号量数据类型定义
//--------------------PV操作的申明------------------------------------------------
void P(Semaphore &s, HANDLE hT);//用于线程同步
void V(Semaphore &s, HANDLE hT);//用于线程同步
//--------------------PV操作的定义------------------------------------------------
void P(Semaphore &s, HANDLE hT){//P操作的定义
s--;//信号量-1
if(s<0){//如果信号量<0
SuspendThread(hT);//挂起进程/线程
}
//否则P原语返回继续执行
}
void V(Semaphore &s, HANDLE hT){//V操作的定义
s++;//信号量+1
if(s<=0){//如果信号量<=0
ResumeThread(hT);//唤醒进程/线程
}
//否则V原语返回继续执行
}