#2
jackli11242008-11-12 12:42
用线程实现
//----------------------------动作函数申明------------------------------
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原语返回继续执行 } |
⑶司机售票员问题
编程用fork()创建一个子进程代表售票员,司机在父进程中,再用系统调用signal()让父进程(司机)捕捉来自子进程(售票员)发出的中断信号,让子进程(售票员)捕捉来自(司机)发出的中断信号,以实现进程间的同步运行