注册 登录
编程论坛 C++ Builder

进程间同步和互斥(操作系统试验)

jackli1124 发布于 2008-10-15 20:18, 3354 次点击
⑶司机售票员问题
    编程用fork()创建一个子进程代表售票员,司机在父进程中,再用系统调用signal()让父进程(司机)捕捉来自子进程(售票员)发出的中断信号,让子进程(售票员)捕捉来自(司机)发出的中断信号,以实现进程间的同步运行
2 回复
#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原语返回继续执行
}
1