问题描述及信号量设定

设公共汽车上,司机和售票员的活动分别是:
司机:启动车辆–正常行驶–到站停车;
售票员:关车门–售票–开车门;
信号量(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; //已经假设汽车的最大容量为80cout<<"温馨提醒:输入上车人数 -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;
}

实现效果截图

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

  1. 操作系统P/V操作(V操作中的典型理解偏差)

    信号量是操作系统提供的⼀种协调共享资源访问的⽅法. 通常信号量表示资源的数量,对应的变量是⼀个整型( sem )变量. 另外,还有两个原⼦操作的系统调⽤函数来控制信号量的,分别是: P 操作:将 se ...

  2. 操作系统P,V操作大总结(包含例题)上篇

    引言:P,V操作必须成对出现,P可简单的理解为消耗一种资源,V可简单的理解为增加一种资源. 1.用信号量实现互斥 semaphore S=1;//定义一个互斥信号量 P1(){ P(S)://加锁 进 ...

  3. 操作系统信号量与P、V操作 初步认识整理

    初步接触,若有不足之处,请各位不吝赐教.谢谢! 首先介绍:信号量 信号量包括整型信号量.结构型信号量.二值信号量. ① 整型信号量 最初,将信号量定义为一个共享的整型量,它保存可供使用的唤醒数目.如果 ...

  4. C语言实现操作系统简单的P V操作

    C语言实现操作系统简单的P V操作 简单说明 cpp的文件,C语言的语法 代码如下 实现效果 简单说明 cpp的文件,C语言的语法 代码如下 #include "stdio.h" ...

  5. 图解操作系统之p,v操作

    操作系统之p,v操作 计算机的核心是CPU,它承担了所有的计算任务:而操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件. 一.操作系统的相关定义 1.操作系统的定义: ...

  6. 操作系统中的信号量及P、V操作

    系统中应该有解决进程同步的一种专门机制.实际上,同步是并发进程之间在执行时序 上的一种相互制约的关系.进程互斥的实质也是同步,可把进程互斥看作是一种特殊的进程同步. 同步机制应该满足如下一些基本要求. ...

  7. 操作系统-------用P,V操作解决生产者和消费者问题(详解!!!)

    问题:         系统中有一组生产者进程和一组消费者进程,生产者每次生产一个产品放入缓冲区,消费者每次从缓冲区取出一个产品并使用(注:这里的产品可以理解成某种数据). 条件:生产者.消费者共享一 ...

  8. 【操作系统】——PV操作

    大家都说操作系统中的PV操作部分看不懂,确实我在专业课中学习这门课时,PV操作被列为书中的重点和难点,就是因为它不好理解.当时自己听完课也是一头雾水,到期末考试结束,也没弄明白这是怎么一回事,更没有意 ...

  9. vp操作 信号量_信号量P,V操作

    2013-07-22 20:20:30 信号量是最早出现的用来解决进程同步与互斥问题的机制(也可实现进程通信),包括一个称为信 号量的变量及对它进行的两个原语操作.信号量为一个整数,我们设这个信号量为 ...

最新文章

  1. AIX中一些常用的命令汇总
  2. 安卓手机可以用python编程软件-python可以编写手机应用吗
  3. Creating an Extender Control to Associate a Client Behavior with a Web Server Control
  4. 2019河南对口高职高专计算机,2019年河南普通高招最后一个批次 高职高专批正式投档...
  5. 广告贴——希望大家有空能够参加11月27日的《葵花宝典——WPF自学手册》签名售书活动...
  6. Android之使用IDA Pro静态分析so文件
  7. 计算机学科技术前沿:互联网上信息可信性的现状
  8. android prgoressBar setProgressDrawable 在4.0系统式正常,在2.3系统上不能正常使用的问题...
  9. io_uring 新异步 IO 机制,性能提升超 150%,堪比 SPDK
  10. 二叉树的创建及遍历--java实现
  11. 如何在Mac网页中长截图?苹果电脑网页截图怎么截长图?
  12. php接入北斗定位,手机如何连接北斗卫星?
  13. python独立样本t检验 图_Python-两独立样本资料t检验
  14. 2017年值得一看的7个APP设计
  15. 电脑重启后 虚拟机不见了?
  16. oracle exp0006,EXP-00006: 出现内部不一致的错误
  17. 【CSDN云VS腾讯云】要不然怎么说CSDN开发云是打工人和学生党的福音呢?
  18. 应用程序运行 Error 1706 错误
  19. 【宇宙最强编辑器VS Code】(八)使用VS Code在线听网易云 —— vsc-netease-music(内附1.35版本之后无声音的解决方案、1.40版本之后的not support问题)
  20. Ubuntu MemoryAnalyzer 启动报错:The platform metadata area could not be written

热门文章

  1. 常用数据分析模型:盈亏平衡分析——收益分析
  2. 怎样学好CSS?这篇文章教会你
  3. 紧跟链改步伐!“链改青岛链湾综合试验区”正式启动
  4. try catch的用法
  5. 开发一个APP多少钱?
  6. hualinux0.10 网络篇:如何学好CCNA(网络入门的正确打开方式)
  7. 照片聚类2014年最新方法——“Clustering by Composition”
  8. 视频教程-【吴刚】网页元素设计WUI初级入门视频教程-UI
  9. 推荐几个优秀的UI素材网站!做网站不发愁了。
  10. 位图和矢量图格式有什么区别?如何一键把图片转换成矢量图?