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

问题描述及信号量设定

设公共汽车上,司机和售票员的活动分别是:
司机:启动车辆–正常行驶–到站停车;
售票员:关车门–售票–开车门;
信号量(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.程序流程图

【司机流程图】
操作系统P、V操作,司机-售票员问题(c语言实现)_第1张图片
【售票员流程图】
操作系统P、V操作,司机-售票员问题(c语言实现)_第2张图片

c语言实现

#include
#include
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<<"旅途愉快,汽车到达总站,再见"<max)
   {
    c=num-max;
	sji=sc-c;

    cout<<"超载"<>sc;
	num=num+sc;

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

实现效果截图

操作系统P、V操作,司机-售票员问题(c语言实现)_第3张图片

你可能感兴趣的:(后端,c++,操作系统)