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


本文探讨了在公共汽车运营中,通过信号量机制实现司机与售票员活动的同步,确保行车安全和效率。司机负责启动车辆、正常行驶和到站停车,售票员负责关车门、售票和开车门,两者通过信号量S1和S2协调行动,避免冲突。同时,文章提供了一段C++代码示例,展示了如何在实际编程中应用信号量概念。
1279





