操作系统P、V操作,司机-售票员问题(c++实现)

3 篇文章 0 订阅
1 篇文章 0 订阅

问题描述及信号量设定

设公共汽车上,司机和售票员的活动分别是:
司机:启动车辆–正常行驶–到站停车;
售票员:关车门–售票–开车门;
信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。
一般来说,信号量S>0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;若S=0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

定义两个同步信号量:

  1. 应设置两个信号量S1和S2。
  2. S1表示是否允许司机启动汽车(或表示售票员是否已经关好车门),其初值为0;
  3. S2表示是否允许售票员开门(或表示司机是否已经到站停车了),其初值为0.
  4. 在启动汽车和开车门前加p操作,在关车门和到站停车后加v操作。

2.程序流程图

【司机流程图】
在这里插入图片描述
【售票员流程图】
在这里插入图片描述

c++实现

#include<iostream>
#include<stdlib.h>
using namespace std;

#define max 80//假设汽车的最大容量为80
int num=0;//初始还没有启动客车上的人数为0
int sc=0;//上车的人数
int xc=0;//下车的人数
int k;//上车-下车,停站上下车后后人数变化,即净上车人数;
 //k=sc-xc;//净上车人数/

int dr();
int cd();
int check()
{
 
  if(sc==-1||xc==-1)
  {cout<<"旅途愉快,汽车到达总站,再见"<<endl;
   exit(1);
  }

return 0;
}
int dr()//司机driver的信号量
{
   
  
   
    //num=num+k;
	if(num<=max)
	{
		cout<<"汽车关门准备开车!"<<endl;
    	cout<<"司机开车!"<<endl;
	}
   
	  	return 0;
  }
int cd()//售票员condutor的信号量
{
   int c,sji;//超载人数/实际上车人数
  
   k=sc-xc;//净上车人数/

   num=num+k;//上下乘客后车上人数

   if(num<=max)
   {
   cout<<"现在车上人数为:"<<num<<endl;
   cout<<"坐好扶稳!"<<endl;
   cout<<"==================================="<<endl;
   cout<<"==================================="<<endl;
   cout<<"==================================="<<endl;
   
   }
   if(num>max)
   {
    c=num-max;
	sji=sc-c;

    cout<<"超载"<<c<<"人!"<<endl;
	cout<<"请后上车的"<<c<<"人"<<"下车等待下一班车!"<<endl;
     num=max;
	cout<<"已下"<<c<<"人"<<endl;
	sc=sji;
	cout<<"实际上车买票成功的人数为:"<<sji<<"人"<<endl;
	cout<<"汽车已坐满!"<<max<<"人"<<endl;
	cout<<"请坐好扶稳,汽车即将关门开车"<<endl;
	cout<<"==================================="<<endl;
	cout<<"==================================="<<endl;
	cout<<"==================================="<<endl;
    
    
   }
   	return 0;
}

/*主函数*/
int main()
{ 
	cout<<"=========欢迎使用司机与售票员信息量同步公交车系统============="<<endl;
	cout<<"======================================================="<<endl;
	cout<<"==============================================="<<endl;
	cout<<"======================================="<<endl;
	cout<<"汽车启动完毕!"<<endl;
	cout<<"初始设定假设汽车的最大乘客容量为:"<<max<<endl; //已经假设汽车的最大容量为80
	cout<<"温馨提醒:输入上车人数 -1 或者下车人数 -1 ,则退出本程序"<<endl;
    cout<<"请输入上车人数!"<<endl;
	cin>>sc;
	num=num+sc;

	while(num>max)
		{
            cout<<"警告:输入上车人数后,人数已经超过限载人数,输入错误请重新输入"<<endl;
	        cout<<"重新输入上车人数为:"<<endl;
            cin>>sc;
			num=sc;
			check();
		}
	cout<<"第一次启动上车人数为"<<sc<<"下车人数为0"<<endl;
	
    check();

      while(sc!=-1||xc!=-1)
	   {
     	
	    cout<<"汽车行驶中.......!"<<endl;
    	cout<<".嘀,下一站到了!"<<endl;
        cout<<"请输入下车人数!"<<endl;
    	cin>>xc;
        check();
    
       	 while(xc>num)
			 {
            cout<<"输入下车人数超过车上人数,输入错误,请重新输入"<<endl;
	        cout<<"重新输入下车人数为:"<<endl;
            cin>>xc;
			check();
			 }
	        cout<<"请输入上车人数!"<<endl;
        	cin>>sc;
	        //cout<<"上车人数为"<<sc<<endl;
			check();
           
       	if(num>max)
			{
               cout<<"警告:输入上车人数后车里人数已经超过车的限载人数"<<endl;
			}
        	
		    //num=num+sc-xc;//上下乘客后车上人数
			//cout<<"车上人数总共为"<<num<<endl;
        	cd();
            dr();
		}
	   
    
	
	return 0;
}

实现效果截图

在这里插入图片描述

  • 10
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值