计算机操作系统-司机与售票员的进程问题-实验报告

合集下载

进程同步模拟设计——司机和售票员问题

进程同步模拟设计——司机和售票员问题

题目: 进程同步模拟设计——司机和售票员问题⑴需求分析;本程序的功能是模拟公车的司机和售票员的开门以及行车的过程,其实也就是一个典型的进程同步互斥问题,其中主要的两点是1:司机开车的时候,售票员不能开门,(这里体现的是进程的互斥问题)车停之后,由司机通知售票员开门(这里体现的是进程的同步问题);2:车门开着的时候,司机不能开车,等售票员把车门关上之后,由售票员通知司机开车。

⑵功能设计(数据结构及模块说明);本程序的设计原理比较简单,就是两大部分,一是司机的行车操作过程,另一个是售票员的开车门和关车门(以及售票,本程序不讨论售票过程)的过程。

现在来说明如何具体实现司机开车和售票员售票的相关过程。

首先,设置2个私有信号量,分别是司机和售票员的。

其中,司机的私有信号量设置为sj,其初始值为0;售票员的私有信号量为spy,其初始值为1;以上的初值表示的是司机和售票员的行车和开关车门的一个具体初始状态,具体的说也就是当车子停着,车门开着的时候的状态,此时,司机不能开车,只有当售票员售完票之后,通知司机才可以。

用操作系统书上的方法写出的流程图如下:司机售票员这样一来的话,仿照书上的P,V操作,实现司机和售票员之间的同步的过程如下:beginsj,spy;semaphore //设置司机和售票员的私有信号量;sj=0;spy=1; //设置初始值;cobeginprocess 司机 //司机的操作过程;beginL1:P(sj);启动车辆;正常行驶;到站停车;V(spy);goto L1;end;process 售票员 //售票员的操作过程;beginL2:P(spy);开车门;关车门;V(sj);售票;goto L2;end;coend;end;⑶开发平台及源程序的主要部分;根据以上的原理,再结合自己所学的程序开发语言,最后得出:本程序的开发平台是c++平台,其中源程序的代码如下:#include<iostream>using namespace std;int spy=1, sj=0; //信号量的定义,spy是售票员的私有信号量,sj 是司机的私有信号量。

计算机操作系统进程调度实验报告

计算机操作系统进程调度实验报告

计算机操作系统进程调度实验报告实验报告:计算机操作系统进程调度1.实验背景与目的计算机操作系统是一种负责管理和协调计算机硬件和软件资源的系统。

进程调度作为操作系统的重要功能之一,主要负责决定哪些进程可以运行、何时运行以及运行多长时间等问题。

本实验旨在通过实践学习进程调度的原理和实现细节,加深对操作系统的理解。

2.实验原理与步骤(1)实验原理:进程调度的目标是充分利用计算机资源,提高系统的吞吐率和响应时间。

常用的调度算法有先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)等。

在本实验中,我们将实现时间片轮转调度算法,并对比不同算法的性能差异。

(2)实验步骤:1)设计进程数据结构:创建进程控制块(PCB)结构体,包含进程的标识符、到达时间、服务时间、剩余时间、等待时间等信息。

2)生成进程:根据指定的进程个数和服务时间范围,生成随机的进程并初始化进程控制块。

3)时间片轮转调度算法:根据时间片大小,按照轮转调度的方式进行进程调度。

4)性能评估:通过记录进程的等待时间和周转时间,比较不同调度算法的性能差异。

3.实验结果与分析通过实验我们生成了10个进程,并使用时间片大小为2进行轮转调度。

下表列出了各个进程的信息及调度结果。

进程到达时间服务时间剩余时间等待时间周转时间P108068P214004P3291310P4350115P542032P6570147P763063P8761714P981071P1093104从实验结果可以看出,时间片轮转调度算法相对公平地分配了CPU给各个进程,减少了等待时间和周转时间。

但是,对于长时间服务的进程,可能出现饥饿问题,即一些耗时较长的进程无法得到充分的CPU时间。

与时间片轮转算法相比,先来先服务(FCFS)算法对于短作业具有更好的响应时间,但可能导致长作业等待时间过长。

最短作业优先(SJF)算法能够最大化短作业的优先级,提高整体性能。

4.实验总结与体会本次实验通过实践了解了进程调度的原理与实现细节,加深了对操作系统的理解。

操作系统实验二

操作系统实验二

操作系统实验二1实验目的通过实际观察 Windows 中线程的同步运行过程进一步理解同步的概念、原理和实现方法。

2实验内容通过 WinDbg 观察 Windows 线程的同步运行过程,具体如下:3实验步骤1)编写同步程序使用 P、V 操作描述司机和售票员的同步关系。

设置信号量:S1: 私有信号量,用于同步,表示售票完毕,初值为 0;S2: 私有信号量,用于同步,表示停车,初值为 02)观察多线程启动 WinDbg 到内核调试模式,复制 1.exe 程序到目标机并运行,出现提示信息:中断目标机运行,输入“!process 0 0”命令查找 1.exe 进程的虚地址:PROCESS 811d13d0 SessionId: 0 Cid: 0760 Peb: 7ffdc000 ParentCid: 0430DirBase: 089d4000 ObjectTable: e18f0fb8 HandleCount: 12.Image: 1.exe可以看到为 811d13d0。

输入命令:kd> !process 811d13d0 2PROCESS 811d13d0 SessionId: 0 Cid: 0760 Peb: 7ffdc000 ParentCid: 0430DirBase: 089d4000 ObjectTable: e18f0fb8 HandleCount: 12.Image: 1.exeTHREAD 811d0020 Cid 0760.0764 Teb: 7ffdf000 Win32Thread: 00000000 WAIT: (WrLpcReply) UserMode Non-Alertable811d020c Semaphore Limit 0x1此时只有一个线程(主线程)存在,地址为 811d0020。

继续让目标机运行,按任意键让1.exe 进程继续,出现提示信息:中断目标机运行,输入命令:kd> !process 811d13d0 2PROCESS 811d13d0 SessionId: 0 Cid: 0760 Peb: 7ffdc000 ParentCid: 0430DirBase: 089d4000 ObjectTable: e18f0fb8 HandleCount: 13.Image: 1.exeTHREAD 811d0020 Cid 0760.0764 Teb: 7ffdf000 Win32Thread: 00000000 WAIT: (WrLpcReply) UserMode Non-Alertable811d020c Semaphore Limit 0x1THREAD 81403db0 Cid 0760.07cc Teb: 7ffde000 Win32Thread: 00000000 WAIT: (Suspended) KernelMode Non-AlertableSuspendCount 181403f40 Semaphore Limit 0x2此时进程中已经存在两个线程,新产生的是司机线程,地址81403db0,处于挂起状态。

操作系统进程部分的习题

操作系统进程部分的习题

进程部分的习题1. 在公共汽车上,司机进程和售票员进程各司其职。

司机在正常行车中售票员售票,两者之间没有制约关系,可以任意并发。

但是在其他环节,司机和售票员进程之间存在着如下同步关系:1)司机停车后等待售票员关门后才能启动车辆。

2)售票员售完票后,等待司机到站停车,停车后才能打开车门。

var door,stop:semaphore:=0,0beginparbegin司机进程:beginwhile(true){wait(door); //等待售票员发送关门信息启动车辆;正常行车;到站停车;signal(stop);//给售票员发送到站信息}end;售票员进程:beginwhile(true){关车门;signal(door); //给司机发送关门信息售票;wait(stop);//等待司机发送到站信息开车门;上下乘客;}endparendend.2.某寺庙,有小和尚,老和尚若干。

有一水缸,由小和尚提水入缸供老和尚饮用。

水缸可容10桶水,水取自同一井中。

水井径窄,每次中能容下一个桶取水。

水桶总数为3个。

每人一次取缸水仅为1桶,且不可同时进行。

试用记录型信号量给出有关取水、入水的算法描述。

根据题意,定义信号量及其初值如下:(1)水桶为临界资源需互斥使用,定义信号量bucket,因有3个桶,故初值为3;(2)水井一次只能允许下一个桶取水,定义互斥信号量well,初值为1;(3)水缸一次只能允许一个人取水,定义互斥信号量jar,初始值为1;(4)empty和full用于小和尚和老和尚之间的同步制约关系。

因为缸能存10桶水,所以empty初始值为10;开始时缸中没有水,full的初始值为0。

semaphore bucket=3,jar=1,full=0,empty=10,well=1; young_monk(){ /*小和尚入水算法*/while(1){wait(empty);wait (bucket);wait (well);从水井中打水;signal(well);wait (jar);倒入水缸;signal (jar);signal (bucket);signal (full);}}old_monk(){ /*老和尚取水算法*/while(1){wait(full);wait (bucket);wait (jar);从缸中取水;signal (jar);signal (bucket);signal (empty);从桶中倒入饮用;}}3.设有3个进程A、B、C,其中A与B构成一对生产者与消费者(A为生产者,B为消费者),共享一个由n个缓冲区组成的缓冲池;B与C也构成一对生产者与消费者(此时B为生产者,C为消费者),共享另一个由m个缓冲区组成的缓冲池。

计算机操作系统进程同步算法习题选

计算机操作系统进程同步算法习题选

s
t
解:
设置四个信号量Sin=1,Sout=0,Tin=1,Tout=0; get: while(1) { wait(Sin); 将数放入S; signal (Sout); } copy: while(1) { wait (Sout); wait (Tin); 将数从S取出放入T; signal (Tout); signal (Sin); } put: while(1) { wait (Tout); 将数从T取走; signal(Tin); }

A1: while (1) { wait(Sin[1]); wait(Sin[2]); 将数据放入缓冲区 signal(Sout[1]); signal(Sout[2]); }
Bi: while (1) { wait(Sout[i]); 从缓冲区取数 signal(Sin[i]); }
向目标前进一步:
司机进程: while(1) { 启动车辆
正常驾驶 到站停车 }…
售票 员 进程 : while(1) { 关门
售票
}…
开门
分析:
为保证车辆行驶安全,售票员必须关好车门, 然后通知司机启动车辆,在行驶过程中售票员不 能打开车门,待车到站停稳后,司机通知售票员 才能打开车门,如此不断重复。为此,须设置两 个信号量S1,S2用来控制司机和售票员的行为, 初值都为0。
解:
算法如下: 司机进程: while(1) { wait(S1) 启动车辆 正常驾驶 到站停车 signal(S2) }… 售票员进 程: while(1) { 关门 signal(S1)
售票
wait(S2) 开门 }…
【例题2】
1.用wait、signal操作解决下图之同步问题 提示:分别考虑对缓冲区S和T的同步,再 合并考虑 get copy put

计算机操作系统-司机与售票员的进程问题

计算机操作系统-司机与售票员的进程问题

计算机操作系统实验报告-------售票员和汽车司机的进程同步问题一、设计分析司机与售票员要协同工作:一方面只有售票员把门关好之后司机才能开车,因此售票员关好门之后要通知司机开车;另一方面,也只有司机把车停下之后售票员才能开门让乘客下车和上车,此时司机应通知售票员。

汽车当前正在始发站停车让乘客上车。

因此,必须设置一定的信号量来实现他们之间的同步问题。

把司机与售票员的信号量设置为全局变量,并把客车上的人数:现在人数、下车人数、上车人数设置为全局变量;设置司机与售票员各自的线程。

考虑到第一站和最后一站的问题,应单独处理,故在各自的线程中分情况讨论:由于下车的人数是随机的,设计时考虑到了人数可能会超过客车的最大上限的问题。

具体的思路是下面的图示。

二、算法实现(源代码)#include<stdlib.h>#include<iostream.h>#include<stdio.h>#include<windows.h>#include<time.h>#define total_num 88 //假设汽车的最大容量为88#define total_pork 9 //总的站数int recent_num=0; //某一时刻的客车上的人数int get_on_num; //上车的人数int get_off_num; //下车的人数int pork=1; //赋初始值HANDLE SJ; //司机的信号量HANDLE SPY; //售票员的信号量int Get_random(int min, int max)//产生一定范围的随机数,可避免下面程序的判断超出客车的最大容量问题{int a;srand((int)time(0));while(1){a=rand()%(total_num+1);if(a>=min && a<=max) return a;}}//司机的线程DWORD WINAPI Thread_Driver(LPVOID Driver){while(pork<=total_num){if(pork==total_pork){WaitForSingleObject(SJ,INFINITE);cout<<"到达总站,欢迎您下次乘坐**路公交车"<<endl;cout<<recent_num<<"名乘客到达总站"<<endl;return 0;}else{ReleaseSemaphore(SPY,1, NULL);WaitForSingleObject(SJ,INFINITE);cout<<"汽车启动"<<endl;cout<<endl;}Sleep(1000);}return 0;}//售票员的线程DWORD WINAPI Thread_Conductor(LPVOID SPY){while(1){if(pork<total_pork){cout<<"这是第"<<pork<<"站"<<endl;WaitForSingleObject(SPY,INFINITE);if(pork==1){cout<<"SPY开始售票"<<endl;get_on_num=Get_random(0,total_num-recent_num);cout<<get_on_num<<"名乘客从该站上车"<<endl;recent_num+=get_on_num;cout<<"共有"<<recent_num<<"名乘客在公交车上"<<endl;}else{cout<<"SJ停好车,乘客开始上下车"<<endl;get_off_num=Get_random(0,recent_num);cout<<get_off_num<<"名乘客在第"<<pork<<"站下车"<<endl; Sleep(1000);recent_num-=get_off_num;cout<<"SPY开始卖票"<<endl;get_on_num=Get_random(0,total_num-recent_num);cout<<get_on_num<<"名乘客在第"<<pork<<"站上车"<<endl; recent_num+=get_on_num;cout<<"现在共有"<<recent_num<<"名乘客在车上"<<endl;}cout<<"此时车上总共有"<<recent_num<<"名乘客在"<<endl;pork++;ReleaseSemaphore(SJ,1, NULL);}if(pork==total_pork){ReleaseSemaphore(SJ,1, NULL);WaitForSingleObject(SPY,INFINITE);return 0;}Sleep(1000);}return 0;}//主函数int main(){HANDLE SJ;HANDLE SPY;SJ=CreateSemaphore(NULL,0,1,"semaphore_driver"); //创建司机的信号量 SPY=CreateSemaphore(NULL,0,1,"semaphore_conductor");//创建售票员的信号量SJ=CreateThread(NULL,0,Thread_Driver,&SJ,0,NULL); //创建司机的线程 SPY=CreateThread(NULL,0,Thread_Conductor,&SPY,0,NULL);//创建售票员的线程CloseHandle(SJ);CloseHandle(SPY);while(1);system("pause");return 0;}三.实现结果四、心得体会1、因为司机与售票员是两条单独处理的线程。

进程同步模拟课程设计——司机和售票员问题

进程同步模拟课程设计——司机和售票员问题

附件1:学号:课程设计题目进程同步模拟设计——司机和售票员问题学院计算机科学与技术专业计算机科学与技术班级姓名指导教师2011 年 1 月21 日课程设计任务书学生姓名:专业班级:运算机科学与技术指导教师:工作单位:运算机科学与技术学院题目: 进程同步模拟设计——司机和售票员问题初始条件:1.预备内容:阅读操作系统的进程治理章节内容,对进程的同步和互斥,和信号量机制度有深切的明白得。

2.实践预备:把握一种运算机高级语言的利用。

要求完成的要紧任务:(包括课程设计工作量及其技术要求,和说明书撰写等具体要求)1.模拟公共汽车司机和售票员开关门及行车操作的同步模型。

2.设计报告内容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的要紧部份;⑷测试用例,运行结果与运行情形分析;⑸自我评判与总结:i)你以为你完成的设计哪些地址做得比较好或比较超卓;ii)什么地址做得不太好,以后如何更正;iii)从本设计取得的收成(在编写,调试,执行进程中的体会和教训);iv)完本钱题是不是有其他的其他方式(若是有,简要说明该方式);v)对实验题的评判和改良意见,请你推荐设计题目。

时刻安排:设计安排一周:周一、周2:完成程序分析及设计。

周二、周3:完成程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁剽窃,一旦发觉,抄与被抄的一概按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日1.课程设计目的与功能1.1课程设计目的:通过课程设计,运用信号量,模拟公共汽车司机和售票员开关门及行车操作的同步模型。

1.2课程设计能够实现以下功能:设置信号量,保证以下四点:●公走运行的时候售票员不能开车门;●公交停下,售票员方可打开车门;●公交车门打开时,司机不能开车;●公交车门关上时,司机方能启动公交2.需求分析,数据结构或模块说明(功能与框图)2.1 需求分析●为了保证公走运行的时候车门不能开,应该设置一个表示公走运行的信号量,1表示公走运行在,0表示车已停下;●为了保证车门打开的时候司机不能启动公交,因此应设置一个表示车门是不是打开的信号量,0表示公交门打开,1表示公交门关上●依照以上分析,两个信号量在同一时刻必然相反,由此取得结论:设置一个信号量,1表示车停门开,0表示车开门关2.2 数据结构1.Bus类●成员变量:int flag表示公共的信号量,1表示车停门开,0表示车开门关●方式:public synchronized void open(),表示乘务员开车门的动作public synchronized void drive(),表示司机启动车辆的动作2.Driver类,继承于Thread类●成员变量:private Bus c,表示该司机所驾驶的公交是c●方式:public void run(),执行Bus c的driver()方式3.Conductor类,继承于Thread类●成员变量:private Bus c,表示该司机所驾驶的公交是c●方式:public void run(),执行Bus c的open()方式2.3 模块说明●Bus模块那个地址要紧介绍Bus模块中的open()与driver()方式:1.open():方式open()具有synchronized关键字,表示该方式在执行的进程中,其他方法不能够改变该方法所在对象中所拥有的值,因此保证了时间的同步性。

用多线程模拟汽车司机与售票员需求分析试验报告

用多线程模拟汽车司机与售票员需求分析试验报告

操作系统:用多线程模拟汽车司机与售票员需求分析试验报告本实验利用多线程模拟汽车司机与售票员之间的协同工作即同步过程。

一方面只有售票员把车门关好了司机才能开车,因此,售票员关好车门应通知司机开车;另一方面,只有汽车已经停下,售票员才能开门上下客,故司机停车后应通知售票员。

实验的结果是在屏幕显示二者的同步过程。

一、设计过程基本原理:在Windows的一个进程内包含一个或多个线程,32位Windows环境下的WIN32 API提供了多线程应用程序开发所需的接口函数,本实验就是C++语言编写的WIN32 API的多线程编程。

具体过程:1.创建两个信号对象,设定初始值;2.创建两个子线程函数,一个为司机的操作过程,一个为售票员的操作过程。

我们在这里设定站点数为10个;在司机操作的子线程中,用一个while循环,当到最后一站时,就退出,此时,程序运行结束。

3.编写主线程函数,在其中调用两个子线程。

二、源代码#include <iostream.h>#include <windows.h>HANDLE hSemaphore1=CreateSemaphore(NULL, 0, 1, NULL);HANDLE hSemaphore2=CreateSemaphore(NULL, 0, 1, NULL);int station=1;DWORD WINAPI ThreadDriver( LPVOID LpParameter ){while(station<=10){cout<<"司机正常行车"<<endl;cout<<"前方为"<<station<<"站点"<<endl;if(station==10){cout<<"终点站到了"<<endl;return 0;}cout<<"到达"<<station<<"站点"<<endl;ReleaseSemaphore(hSemaphore2,1,NULL);WaitForSingleObject(hSemaphore1,INFINITE);cout<<"离站开车"<<station<<endl<<endl<<endl;Sleep(500);station++;}return 0;}DWORD WINAPI ThreadConductor( LPVOID LpParameter ){while(1){WaitForSingleObject(hSemaphore2,INFINITE);cout<<"售票员开门"<<endl;Sleep(1000);cout<<"乘客正在上车"<<endl;Sleep(6000);cout<<"售票员关门"<<endl;cout<<"售票员向刚上车售票"<<endl;ReleaseSemaphore(hSemaphore1,1,NULL);Sleep(1000);}return 0;}int main(){HANDLE hDriver;HANDLE hConductor;cout<<"多线程模拟司机售票员同步过程\n";cout<<"----------------------------\n";hDriver=CreateThread(NULL,0,ThreadDriver,NULL,0,NULL);Sleep(10);hConductor=CreateThread(NULL,0,ThreadConductor,NULL,0,NULL);Sleep(300000);CloseHandle(hDriver);CloseHandle(hConductor);return 0;}三、运行结果:多线程模拟司机售票员同步过程----------------------------司机正常行车前方为1站点到达1站点乘客正在上车售票员关门售票员向刚上车售票离站开车司机正常行车前方为2站点到达2站点售票员开门乘客正在上车售票员关门售票员向刚上车售票离站开车司机正常行车前方为3站点到达3站点售票员开门乘客正在上车售票员关门售票员向刚上车售票离站开车司机正常行车前方为4站点到达4站点售票员开门乘客正在上车售票员关门售票员向刚上车售票离站开车司机正常行车前方为5站点到达5站点售票员开门乘客正在上车售票员关门售票员向刚上车售票司机正常行车前方为6站点到达6站点售票员开门乘客正在上车售票员关门售票员向刚上车售票离站开车司机正常行车前方为7站点到达7站点售票员开门乘客正在上车售票员关门售票员向刚上车售票离站开车司机正常行车前方为8站点到达8站点售票员开门乘客正在上车售票员关门售票员向刚上车售票离站开车司机正常行车前方为9站点到达9站点售票员开门乘客正在上车售票员关门售票员向刚上车售票离站开车司机正常行车前方为10站点终点站到了四、程序结果分析从运行结果看,基本上模拟了司机和售票员的同步过程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机操作系统实验报告
-------售票员和汽车司机的进程同步问题
一、设计分析
司机与售票员要协同工作:一方面只有售票员把门关好之后司机才能开车,因此售票员关好门之后要通知司机开车;另一方面,也只有司机把车停下之后售票员才能开门让乘客下车和上车,此时司机应通知售票员。

汽车当前正在始发站停车让乘客上车。

因此,必须设置一定的信号量来实现他们之间的同步问题。

把司机与售票员的信号量设置为全局变量,并把客车上的人数:现在人数、下车人数、上车人数设置为全局变量;设置司机与售票员各自的线程。

考虑到第一站和最后一站的问题,应单独处理,故在各自的线程中分情况讨论:
由于下车的人数是随机的,设计时考虑到了人数可能会超过客车的最大上限的问题。

具体的思路是下面的图示。

二、算法实现(源代码)
#include<stdlib.h>
#include<iostream.h>
#include<stdio.h>
#include<windows.h>
#include<time.h>
#define total_num 88 //假设汽车的最大容量为88
#define total_pork 9 //总的站数
int recent_num=0; //某一时刻的客车上的人数
int get_on_num; //上车的人数
int get_off_num; //下车的人数
int pork=1; //赋初始值
HANDLE SJ; //司机的信号量
HANDLE SPY; //售票员的信号量
int Get_random(int min, int max)
//产生一定范围的随机数,可避免下面程序的判断超出客车的最大容量问题{
int a;
srand((int)time(0));
while(1)
{
a=rand()%(total_num+1);
if(a>=min && a<=max) return a;
}
}
//司机的线程
DWORD WINAPI Thread_Driver(LPVOID Driver)
{
while(pork<=total_num)
{
if(pork==total_pork)
{
WaitForSingleObject(SJ,INFINITE);
cout<<"到达总站,欢迎您下次乘坐**路公交车"<<endl;
cout<<recent_num<<"名乘客到达总站"<<endl;
return 0;
}
else
{
ReleaseSemaphore(SPY,1, NULL);
WaitForSingleObject(SJ,INFINITE);
cout<<"汽车启动"<<endl;
cout<<endl;
}
Sleep(1000);
}
return 0;
}
//售票员的线程
DWORD WINAPI Thread_Conductor(LPVOID SPY)
{
while(1)
{
if(pork<total_pork)
{
cout<<"这是第"<<pork<<"站"<<endl;
WaitForSingleObject(SPY,INFINITE);
if(pork==1)
{
cout<<"SPY开始售票"<<endl;
get_on_num=Get_random(0,total_num-recent_num);
cout<<get_on_num<<"名乘客从该站上车"<<endl;
recent_num+=get_on_num;
cout<<"共有"<<recent_num<<"名乘客在公交车上"<<endl;
}
else
{
cout<<"SJ停好车,乘客开始上下车"<<endl;
get_off_num=Get_random(0,recent_num);
cout<<get_off_num<<"名乘客在第"<<pork<<"站下车"<<endl; Sleep(1000);
recent_num-=get_off_num;
cout<<"SPY开始卖票"<<endl;
get_on_num=Get_random(0,total_num-recent_num);
cout<<get_on_num<<"名乘客在第"<<pork<<"站上车"<<endl; recent_num+=get_on_num;
cout<<"现在共有"<<recent_num<<"名乘客在车上"<<endl;
}
cout<<"此时车上总共有"<<recent_num<<"名乘客在"<<endl;
pork++;
ReleaseSemaphore(SJ,1, NULL);
}
if(pork==total_pork)
{
ReleaseSemaphore(SJ,1, NULL);
WaitForSingleObject(SPY,INFINITE);
return 0;
}
Sleep(1000);
}
return 0;
}
//主函数
int main()
{
HANDLE SJ;
HANDLE SPY;
SJ=CreateSemaphore(NULL,0,1,"semaphore_driver"); //创建司机的信号量 SPY=CreateSemaphore(NULL,0,1,"semaphore_conductor");
//创建售票员的信号量
SJ=CreateThread(NULL,0,Thread_Driver,&SJ,0,NULL); //创建司机的线程 SPY=CreateThread(NULL,0,Thread_Conductor,&SPY,0,NULL);
//创建售票员的线程
CloseHandle(SJ);
CloseHandle(SPY);
while(1);
system("pause");
return 0;
}
三.实现结果
四、心得体会
1、因为司机与售票员是两条单独处理的线程。

程序先对司机的线程进行设计,接着再进行售票员的线程设计。

因为两者是需要相互协调,又先后顺序的,所以编起程序来比较复杂,而且很乱,尤其对于第一次接触的我们而言。

2、上下车的人数是随机的,所以,我们在编程序时必须注意使程序能够判断所出现的随机数在汽车可以承载的最大容量之内。

3、C++语言基础不是很好,所以编起程序来比较费力,这种设计性的实验对于我们而言还是有一定的难度的,所以部分程序是参照网上的类似程序。

相关文档
最新文档