还剩2页未读,继续阅读
文本内容:
计算机操作系统-司机与售票员的进程问题计算机操作系统实验报告
一、设计分析司机与售票员要协同工作:一方面只有售票员把门关好之后司机才能开车,因此售票员关好门之后要通知司机开车;另一方面,也只有司机把车停下之后售票员才能开门让乘客下车和上车,此时司机应通知售票员汽车当前正在始发站停车让乘客上车因此,必须设置一定的信号量来实现他们之间的同步问题把司机与售票员的信号量设置为全局变量,并把客车上的人数现在人数、下车人数、上车人数设置为全局变量;设置司机与售票员各自的线程考虑到第一站和最后一站的问题,应单独处理,故在各自的线程中分情况讨论由于下车的人数是随机的,设计时考虑到了人数可能会超过客车的最大上限的问题具体的思路是下面的图示
二、算法实现(源代码)#include#include#include#include#include#definetotal_num88〃假设汽车的最大容量为88#define total_pork9〃总的站数int recentnum=O;〃某一时刻的客车上的人数int get_on_num;〃上车的人数int get_off_num;〃下车的人数int pork=1;〃赋初始值HANDLE SJ;〃司机的信号量HANDLE SPY;〃售票员的信号量int Get_randomint min,int max〃产生一定范围的随机数,可避免下面程序的判断超出客车的最大容量问题{int a;srandinttimeO;whilel{a=rand%total_num+1;ifa=min}〃司机的线程a=maxreturn a;}DWORD WINAPIThread_DriverLPVOIDDriver{whilepork=total_num{ifpork==total_pork{WaitF“到达总站,欢迎您下次乘orSingleObjectSJ,INFINITE;cout坐**路公交车”“名乘客到达总站6£1;cout«recent__num endl;return0;}=else=p=n{ReleaseSemaphoreSPY,1,“汽车启动”NULL;WaitForSingleObjectSJ,INFINITE;cout««endl;cout«endl;p=售票员的线程}SleeplOOO;}return0;}//DWORD WINAPIThread_ConductorLPVOIDSPY{whilel{ifporktotal_pork{p=,n〈这是第”coutWaitForSingleObjectSPY,INFINITE;ifpork==1{cout«uSPY开始售票”endl;p=”get_on_num=Get_random0total_num-recent_num;9cout«get_on_num«u乘客从该站上车”endl;p=nrecent_num+=get_on_num;cout«uft W,,«recent_num«“名乘客在公交车上”endl;}else=n p=n停好车,乘客开始上下车cout«“SJ endl;p=”get_offLnum=Get_random0,recent_num;匚“名乘客在第”cout«get_of numSleep1000;recent_num-=get_off_num;cout«uSPY开始卖票”«endl;get_on_num=get_random0,total_num-recent_num;cout«get_on_num«u乘客在第”“此时车上总共有“名乘客在”cout recent_num«endl;pork++;releasesemaphoresj,1,null;}=ifpork=H=total_pork{n releasesemaphoresj,1,=n;}null;waitforsingleobjectspyinfinite;return=0;}=sleep000二“p=”〃主函数return0;}int main{HANDLE SJ;HANDLE建司SPY;SJ=CreateSemaphoreNULL,0,l,semaphore_driver;//6!机的信号量SPY=CreateSemaphoreNULL,0,1,ttsemaphore_conductor,J;//创建售票员的信号量创SJ=CreateThreadNULL,O,Thread_Driver,SJ,O,NULL;//建司机的线程;〃SPY=CreateThreadNULL,0,Thread_Conductor,SPY,0,NULL创建售票员的线程CloseHandleSJ;CloseHandleSPY;while1;sy stempause;return0;}三.实现结果、因为司机与售票员是两条单独处理的线程程序先对1司机的线程进行设计,接着再进行售票员的线程设计因为两者是需要相互协调,又先后顺序的,所以编起程序来比较复杂,而且很乱,尤其对于第一次接触的我们而言、上下车的人数是随机的,所以,我们在编程序时必须2注意使程序能够判断所出现的随机数在汽车可以承载的最大容量之内、语言基础不是很好,所以编起程序来比较费力,这3C++种设计性的实验对于我们而言还是有一定的难度的,所以部分程序是参照网上的类似程序。