




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验内容 1、定义一个数据缓存buffer及用于实现同步互斥的信号量。 2、定义一个读者函数:l 当有写者在占用buffer时,读者应该等待,直到写者不再使用该buffer。l 当有其他读者在占用buffer时,读者可对buffer进行读取操作。l 当buffer中有数据时,则从其中读取一个数据,并显示然后退出。l 当buffer中没有数据时,应等待,直到buffer中有数据可读。 3、定义一个写者函数l 当有读者在占用buffer时,写者应该等待,直到所有的读者都退出为止。l 当有其他写者占用buffer时,该写者应该等待,直到占用buffer的写者退出为止。l 当buffer有空闲时,写者
2、应该在buffer中写入一个数据并退出。l 当buffer满时,写者应该等待,直到buffer有空闲为止。 4、定义主函数,在其中可以任意创建读者与写者。l 可根据用户输入创建读者或写者进程(线程)。 5、用户界面2. 写者:开始读出的内容:1. 读者:开始结束21读者队列等待结束写出的内容:Hello world !结束实验当堂所要完成事情列表:1. 调试程序使其在读者优先模式下可以运行并且能实现基本的功能得出正确的结果:能够实现读写互斥,写写互斥,读读不互斥,一个进程结束能够唤醒等待队列中的进程(先读者队列后写着队列)2. 根据实验要求完善功能:由用户决定写者向缓冲区中写入的内容,读者能够
3、读出并显示出来;当缓冲区中没有数据时,读者要等待,直到缓冲区中有数据才能读3. 根据“读者优先”加以改变,增加一个“写者优先”模式,并且由用户来选择模式源代码:#include#includeint rcount=0;/正在读的读者数量int wcount=0;/写者队列中等待写操作的写者数量int read_id=0;/读进程号int write_id=0;/写进程号int w=1;/读写互斥信号量char temp300 = 0;int choice; /用户选择读者优先OR写者优先int sign; /标识temp空的信号量 0表示temp空void WFwakeup();void RF
4、wakeup();struct rqueue/读者等待队列int readers200;int index;rq;struct wqueue/写者等待队列int writers200;int index;wq;/*void first() /初始化int i;rq.index = 0;wq.index = 0;for(i = 0;i20;i+)rq.readersi = 0;wq.writersi = 0;*/*读进程读操作void read()int i = 0;read_id+;if(rcount = 0)/当前没有读进程在读 可能有写进程在写 可能CPU空闲if(w=1) /如果CPU空
5、闲,读者拿到CPUw-;/ 相当于一个P操作rcount+;if(temp0 = 0)sign = 0;if(choice = 1)rq.readersrq.index+=read_id;/将读者进程加入等待队列RFwakeup();return;elserq.readersrq.index+=read_id;/将读者进程加入等待队列WFwakeup();return;/ifprintf(读者%d正在读n,read_id);for(i = 0;i 300;i+)/读取temp内容 即写者写的内容if(tempi = 0)printf(n);return;/ifprintf(%c,tempi);
6、/for/ifelse/写者线程正在执行printf(!有写者在写不能读!n);rq.readersrq.index+=read_id;/将读者进程加入等待队列/else/ifelse/rcount !=1 则知道当前已经有读者在读,读读不互斥,则这个读者可以直接进来了读printf(读者%d正在读n,read_id);for(i = 0;i 300;i+) if(tempi = 0)printf(n);return;printf(%c,tempi);/for/else/*写进程写操作void write()write_id+;if(w = 0)if(rcount != 0 )/有读者进程在执
7、行printf(!有读者在读不能写!n);wq.writerswq.index+=write_id;/将写者进程加入等待队列wcount+;return;if(rcount = 0 )/rcount = 0则当前无读者,但w = 0,所以有写者在写printf(!有写者在写不能写!n);wq.writerswq.index+=write_id;/将写者进程加入等待队列wcount+;return;if(w = 1)w-;printf(写者%d正在写n请输入要写的内容,write_id); scanf(%s,temp);/while/if/*读者优先时唤醒进程void RFwakeup()int
8、 i = 0;int j = 0;int m,n;m = rq.index;/n = wq.index;if(rcount = 0)/当前无读进程,是写者在写 -停止运行写进程bool reader_wait=false; w=1;printf(写者已经写完n);sign = 1;/temp中已经有内容 要置1for(i=0;i=m;i+)/index为当前读者队列中的等待进程数if(rq.readersi!=0)reader_wait=true; /确实有读者在等待printf(等待的读者%d正在读n,rq.readersi);w = 0;for(j = 0;j 300;j+)if(temp
9、j = 0)printf(n);break;/ifprintf(%c,tempj);/forrq.readersi=0;rcount+;rq.index-;/if/forif(!reader_wait)/没有读者等待,看是否有写者等待for(int i=0;i=wq.index;i+)/检查写者等待队列if(wq.writersi!=0)w = 0;printf(等待的写者%d正在写n请输入要写入的内容,wq.writersi);scanf(%s,temp);wq.writersi=0;wcount-;break;/if/for/if/return;/ifelse/rcount != 0读者正
10、在读,stop读此时若有等待必为写者rcount=0;w = 1;if(sign = 0)printf(缓冲区空 等待写者n);return;elseprintf(读者已经读完n);for(int i=0;i=wq.index;i+)/检查写者等待队列if(wq.writersi!=0)w = 0;printf(等待的写者%d正在写n请输入要写入的内容,wq.writersi);scanf(%s,temp);wq.writersi=0;wcount-;break;/if/for/else/*写者优先唤醒void WFwakeup()int i = 0;int j = 0;int m,n;m =
11、 rq.index;/n = wq.index;if(rcount = 0)/当前无读进程,是写者在写 -停止运行写进程bool writer_wait=false; w=1;printf(写者已经写完n);sign = 1;/temp中已经有内容 要置1for(i=0;i=wq.index;i+)/index为当前写者队列中的等待进程数if(wq.writersi!=0)writer_wait=true; /确实有写者在等待printf(等待的写者%d正在写n 请输入要写的内容n,wq.writersi);w = 0;scanf(%s,temp);wq.writersi=0;wcount-;
12、break;if(!writer_wait)/没有xie者等待,看是否有du者等待for(int i=0;i=m;i+)/检查写者等待队列if(rq.readersi!=0)w = 0;printf(等待的读者%d正在读n,rq.readersi);for(j = 0;j 300;j+)if(tempj = 0)printf(n);rq.index-;break;/ifprintf(%c,tempj);/forrq.readersi=0;rcount+;/if/for/if/return;/ifelse/rcount != 0读者正在读,stop读此时若有等待必为写者rcount=0;w =
13、1;printf(读者已经读完n);for(int i=0;i);scanf(%s,&i);switch(i)case 1:read();break;case 2:write();break;case 3:RFwakeup();break;case 4:exit(0);default:printf(输入错误请重新输入n);while(true);void menu2()char i;printf( 1-创建读者进程n 2-创建写者进程n 3-结束当前执行的进程n 4-退出程序n);printf(*n);doprintf(当前队列中有读者: %d个 写者: %d个n,rq.index,wcoun
14、t);printf(*n);printf( -);scanf(%s,&i);switch(i)case 1:read();break;case 2:write();break;case 3:WFwakeup();break;case 4:exit(0);default:printf(输入错误请重新输入n);while(true);void main()printf(*n);printf( 读者与写者实验 n 1.读者优先n 2.写者优先n);scanf(%d,&choice);while(1)if(choice = 1)menu1();if(choice = 2)menu2();if(choi
15、ce != 1 & choice != 2)printf(输入错误请重新输入n);scanf(%d,&choice);实验流程图:开始退出写者优先读者优先结束写者优先唤醒读者优先唤醒写操作读操作是否有读者在读有写者 读者入队是否有读者在读NYNNCPU是否空闲有读者 写者入队YCpu是否空闲进行读操作YYN进行写操作缓冲区是否为空读操作N有写者,写操作入队Y入读者等待队列调用读者优先唤醒读者优先唤醒Y当前有无读者在读N有无读者等待NY读者出队进行读操作直到读者队空有无写者等待YN进行写操作N缓冲区是否为空返回Y有读者说明若有等待必为写者写者优先唤醒Y当前有无读者在读N有无写者等待NY写者出队进行写操作直到写者队空有无读者等待Y进行读操作直到读者队列为空N写者队列是否为空返回YN进行写操作直到写者队列为空核心部分设计思路:分别用两个队列来存放等待的读者进程和写者进程,一个进程结束后就要将因他阻塞的进程唤醒,如果是读者优先,则先检查读者进程,如果发现读者进程不为空,就进行读操作,直到读者进程为空,才进行写操作;同理,如果是写者优先,则先检查写进程,如果发现写者进程不为空,就进行写操作,直到写者进程为空,才进行读
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消防服务管理措施及安全应急保障措施
- 成都市盐道街中学外语学校招聘考试真题2024
- 智能家居产品试验检测计划
- 公司量具押金管理办法
- 公路项目养护管理办法
- 关于吊车出租管理办法
- 勐海滞留人员管理办法
- 包装食品售后管理办法
- 化肥进价销售管理办法
- 公司外汇结汇管理办法
- 水库安全管理防汛应急预案
- 2025至2030中国燕窝行业市场运行分析及竞争格局与投资方向报告
- 2025年河北省中考语文试卷真题及答案详解(精校打印版)
- 青年人才专项答辩模板
- 2025年6月四川高中学业水平合格考生物试卷真题(含答案详解)
- 2025年云南省中考英语试卷真题(含标准答案及解析)
- 口服靶向药讲课件
- 12024-2025学年暑假安全教育主题班会课件
- 金属标牌的粉末喷涂工艺考核试卷
- 系统补丁升级管理制度
- 先天性甲状腺功能减退症诊治指南解读
评论
0/150
提交评论