读者写者问题实验代码

读者写者问题实验代码

ID:39309945

大小:202.36 KB

页数:12页

时间:2019-06-30

读者写者问题实验代码_第1页
读者写者问题实验代码_第2页
读者写者问题实验代码_第3页
读者写者问题实验代码_第4页
读者写者问题实验代码_第5页
资源描述:

《读者写者问题实验代码》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、实验内容1、定义一个数据缓存buffer及用于实现同步互斥的信号量。2、定义一个读者函数:l当有写者在占用buffer时,读者应该等待,直到写者不再使用该buffer。l当有其他读者在占用buffer时,读者可对buffer进行读取操作。l当buffer中有数据时,则从其中读取一个数据,并显示然后退出。l当buffer中没有数据时,应等待,直到buffer中有数据可读。3、定义一个写者函数l当有读者在占用buffer时,写者应该等待,直到所有的读者都退出为止。l当有其他写者占用buffer时,该写者应该等待,直到占用buffer的写者退出

2、为止。l当buffer有空闲时,写者应该在buffer中写入一个数据并退出。l当buffer满时,写者应该等待,直到buffer有空闲为止。4、定义主函数,在其中可以任意创建读者与写者。l可根据用户输入创建读者或写者进程(线程)。5、用户界面2.写者:开始读出的内容:1.读者:开始结束21读者队列等待结束写出的内容:Helloworld!结束实验当堂所要完成事情列表:1.调试程序使其在读者优先模式下可以运行并且能实现基本的功能得出正确的结果:能够实现读写互斥,写写互斥,读读不互斥,一个进程结束能够唤醒等待队列中的进程(先读者队列后写着队列

3、)2.根据实验要求完善功能:由用户决定写者向缓冲区中写入的内容,读者能够读出并显示出来;当缓冲区中没有数据时,读者要等待,直到缓冲区中有数据才能读3.根据“读者优先”加以改变,增加一个“写者优先”模式,并且由用户来选择模式源代码:#include#includeintrcount=0;//正在读的读者数量intwcount=0;//写者队列中等待写操作的写者数量intread_id=0;//读进程号intwrite_id=0;//写进程号intw=1;//读写互斥信号量chartemp[300]={'

4、'};intchoice;//用户选择读者优先OR写者优先intsign;//标识temp空的信号量0表示temp空voidWFwakeup();voidRFwakeup();structrqueue{//读者等待队列intreaders[200];intindex;}rq;structwqueue{//写者等待队列intwriters[200];intindex;}wq;/*voidfirst(){//初始化inti;rq.index=0;wq.index=0;for(i=0;i<20;i++){rq.readers[i]=0;wq

5、.writers[i]=0;}}*///*******************************************读进程读操作voidread(){inti=0;read_id++;if(rcount==0){//当前没有读进程在读可能有写进程在写可能CPU空闲if(w==1){//如果CPU空闲,读者拿到CPUw--;//相当于一个P操作rcount++;if(temp[0]==''){sign=0;if(choice==1){rq.readers[rq.index++]=read_id;//将读者进程加入等待队列RFw

6、akeup();return;}else{rq.readers[rq.index++]=read_id;//将读者进程加入等待队列WFwakeup();return;}}//ifprintf("读者%d正在读",read_id);for(i=0;i<300;i++){//读取temp内容即写者写的内容if(temp[i]==''){printf("");return;}//ifprintf("%c",temp[i]);}//for}//ifelse{//写者线程正在执行printf("!有写者在写不能读!");rq.rea

7、ders[rq.index++]=read_id;//将读者进程加入等待队列}//else}//ifelse{//rcount!=1则知道当前已经有读者在读,读读不互斥,则这个读者可以直接进来了读printf("读者%d正在读",read_id);for(i=0;i<300;i++){if(temp[i]==''){printf("");return;}printf("%c",temp[i]);}//for}//else}//***************************写进程写操作voidwrite(){write_

8、id++;if(w==0){if(rcount!=0){//有读者进程在执行printf("!有读者在读不能写!");wq.writers[wq.index++]=write_id;//将

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。