| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3350 人关注过本帖
标题:进程间同步和互斥(操作系统试验)
只看楼主 加入收藏
jackli1124
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-4-26
收藏
 问题点数:0 回复次数:2 
进程间同步和互斥(操作系统试验)
⑶司机售票员问题
    编程用fork()创建一个子进程代表售票员,司机在父进程中,再用系统调用signal()让父进程(司机)捕捉来自子进程(售票员)发出的中断信号,让子进程(售票员)捕捉来自(司机)发出的中断信号,以实现进程间的同步运行
搜索更多相关主题的帖子: 操作系统 进程 试验 
2008-10-15 20:18
jackli1124
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-4-26
收藏
得分:0 
用线程实现
//----------------------------动作函数申明------------------------------
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原语返回继续执行
}
2008-11-12 12:42
快速回复:进程间同步和互斥(操作系统试验)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016727 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved