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

来源:网络收集 时间:2025-04-26 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xuecool-com或QQ:370150219 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

计算机操作系统实验报告

-------售票员和汽车司机的进程同步问题

一、设计分析

司机与售票员要协同工作:一方面只有售票员把门关好之后司机才能开车,因此售票员关好门之后要通知司机开车;另一方面,也只有司机把车停下之后售票员才能开门让乘客下车和上车,此时司机应通知售票员。汽车当前正在始发站停车让乘客上车。因此,必须设置一定的信号量来实现他们之间的同步问题。

把司机与售票员的信号量设置为全局变量,并把客车上的人数:现在人数、下车人数、上车人数设置为全局变量;设置司机与售票员各自的线程。考虑到第一站和最后一站的问题,应单独处理,故在各自的线程中分情况讨论:

由于下车的人数是随机的,设计时考虑到了人数可能会超过客车的最大上限的问题。具体的思路是下面的图示。

1

二、算法实现(源代码)

#include #include #include #include

#include

#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<<\到达总站,欢迎您下次乘坐**路公交车\ cout<

ReleaseSemaphore(SPY,1, NULL); WaitForSingleObject(SJ,INFINITE); cout<<\汽车启动\ cout<

2

}

Sleep(1000); }

return 0; }

//售票员的线程

DWORD WINAPI Thread_Conductor(LPVOID SPY) {

while(1) {

if(pork

cout<<\这是第\站\ WaitForSingleObject(SPY,INFINITE); if(pork==1) {

cout<<\开始售票\

get_on_num=Get_random(0,total_num-recent_num); cout<

recent_num+=get_on_num;

cout<<\共有\名乘客在公交车上\ } else {

cout<<\停好车,乘客开始上下车\

get_off_num=Get_random(0,recent_num);

cout<

Sleep(1000);

recent_num-=get_off_num; cout<<\开始卖票\

get_on_num=Get_random(0,total_num-recent_num);

cout<

cout<<\现在共有\名乘客在车上\ }

cout<<\此时车上总共有\名乘客在\ pork++;

ReleaseSemaphore(SJ,1, NULL); }

if(pork==total_pork)

{

ReleaseSemaphore(SJ,1, NULL);

WaitForSingleObject(SPY,INFINITE);

3

return 0; }

Sleep(1000); }

return 0; }

//主函数 int main() {

HANDLE SJ;

HANDLE SPY;

SJ=CreateSemaphore(NULL,0,1,\ //创建司机的信号量 SPY=CreateSemaphore(NULL,0,1,\ //创建售票员的信号量

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(\ return 0; }

三.实现结果

4

5

6

四、心得体会

1、因为司机与售票员是两条单独处理的线程。程序先对司机的线程

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

2、上下车的人数是随机的,所以,我们在编程序时必须注意使程序能够判断所出现的随机数在汽车可以承载的最大容量之内。 3、C++语言基础不是很好,所以编起程序来比较费力,这种设计性的实验对于我们而言还是有一定的难度的,所以部分程序是参照网上的类似程序。

7

百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库计算机操作系统-司机与售票员的进程问题在线全文阅读。

计算机操作系统-司机与售票员的进程问题.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.70edu.com/wenku/188113.html(转载请注明文章来源)
Copyright © 2020-2025 70教育网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:370150219 邮箱:370150219@qq.com
苏ICP备16052595号-17
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:7 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219