读者与写者问题(共10页).doc

上传人:飞****2 文档编号:15179983 上传时间:2022-05-11 格式:DOC 页数:10 大小:89KB
返回 下载 相关 举报
读者与写者问题(共10页).doc_第1页
第1页 / 共10页
读者与写者问题(共10页).doc_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《读者与写者问题(共10页).doc》由会员分享,可在线阅读,更多相关《读者与写者问题(共10页).doc(10页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上装 订 线2012-2013学年第 一 学期 学院综合设计读者与写者问题 学号:姓名:成绩:评语:设计要求:用P、V操作实现读者写者问题,写者不多于5个,读者不多于20个。所有读者和写者访问同一个文件all.txt,每个写者向文件添加一行,内容是“Im the writer number X. It is TIME. ”,其中X是pid,TIME是访问文件的时间,格式为hh-mm-ss.ddd;每个读者读出最后一个写者的pid和写的时间,并在屏幕上输出。每个读者或写者的访问次数为32-100之间的随机数,同一个写者相邻两次的访问间隔不得短于0.1秒,同一个读者相邻两次

2、的访问间隔不得短于0.05秒。专心-专注-专业目录读者写者问题的实现1、概述1.1 设计题目读者写者问题的实现1.2 设计目的通过对操作系统内核实现代码的阅读、修改、设计,理解和掌握复杂的操作系统的工作原理。通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。1.3开发环境使用的操作系统:Linux系统使用的编程语言:C语言1.4 设计要求用P、V操作实现读者写者问题,写者不多于5个,读者不多于20个。所有读者和写者访问同一个文件all.txt,每个写者向文件添加一行,内容是“Im the writer number X. It is TIME. ”,其

3、中X是pid,TIME是访问文件的时间,格式为hh-mm-ss.ddd;每个读者读出最后一个写者的pid和写的时间,并在屏幕上输出。每个读者或写者的访问次数为32-100之间的随机数,同一个写者相邻两次的访问间隔不得短于0.1秒,同一个读者相邻两次的访问间隔不得短于0.05秒。2、设计思想读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:(1)任意多个读进程可以同时读这个文件;(2)一次只有一个写进程可以往文件中写;(3)如果一个写进程

4、正在进行操作,禁止任何读进程度文件。3、具体程序实现#include #include #include #include #include #include #define MAX_PERSON 100#define READER 0 /读者#define WRITER 1 /写者#define END -1#define R READER#define W WRITER typedef struct _PersonHANDLE m_hThread;/定义处理线程的句柄int m_nType;/进程类型(读写)int m_nStartTime;/开始时间int m_nWorkTime;/运行

5、时间int m_nID;/进程号Person; Person g_PersonsMAX_PERSON;int g_NumPerson = 0;long g_CurrentTime= 0;/基本时间片数 int g_PersonLists = /进程队列1, W, 4, 5, 2, W, 16, 4, 3, R, 5, 2,4, W, 6, 5, 5, R, 4, 3, END,;int g_NumOfReading = 0;int g_NumOfWriteRequest = 0;/申请写进程的个数HANDLE g_hReadSemaphore;/读者信号HANDLE g_hWriteSemap

6、hore;/写者信号bool finished = false; /所有的读完成/bool wfinished = false; /所有的写完成void CreatePersonList(int *pPersonList);bool CreateReader(int StartTime,int WorkTime,int ID);bool CreateWriter(int StartTime,int WorkTime,int ID);DWORD WINAPI ReaderProc(LPVOID lpParam);DWORD WINAPI WriterProc(LPVOID lpParam);in

7、t main()g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL); /创建信号灯,当前可的资源数为,最大为g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); /创建信号灯,当前可用的资源数为,最大为CreatePersonList(g_PersonLists); / Create All the reader and writersprintf(Created all the reader and writern.n);g_CurrentTime = 0;while(true)g_Cu

8、rrentTime+;Sleep(300); / 300 msprintf(CurrentTime = %dn,g_CurrentTime);if(finished) return 0;system (pause); /return 0;void CreatePersonList(int *pPersonLists)int i=0;int *pList = pPersonLists;bool Ret;while(pList0 != END) switch(pList1)case R:Ret = CreateReader(pList2,pList3,pList0);/351,w452,523,6

9、54break; case W:Ret = CreateWriter(pList2,pList3,pList0);break;if(!Ret)printf(Create Person %d is wrongn,pList0); pList += 4; / move to next person listDWORD WINAPI ReaderProc(LPVOID lpParam)/读过程Person *pPerson = (Person*)lpParam;/ wait for the start timewhile(g_CurrentTime != pPerson-m_nStartTime)

10、printf(Reader %d is Requesting .n,pPerson-m_nID);printf(nn*n);/ wait for the write requestWaitForSingleObject(g_hReadSemaphore,INFINITE); if(g_NumOfReading =0)WaitForSingleObject(g_hWriteSemaphore,INFINITE); g_NumOfReading+;ReleaseSemaphore(g_hReadSemaphore,1,NULL);pPerson-m_nStartTime = g_CurrentTi

11、me;printf(Reader %d is Reading the Shared Buffer.n,pPerson-m_nID);printf(nn*n);while(g_CurrentTime m_nStartTime + pPerson-m_nWorkTime)printf(Reader %d is Exit.n,pPerson-m_nID);printf(nn*n); WaitForSingleObject(g_hReadSemaphore,INFINITE);g_NumOfReading-;if(g_NumOfReading = 0)ReleaseSemaphore(g_hWrite

12、Semaphore,1,NULL);/此时没有读者,可以写ReleaseSemaphore(g_hReadSemaphore,1,NULL);if(pPerson-m_nID = 4) finished = true; /所有的读写完成ExitThread(0);return 0;DWORD WINAPI WriterProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;/ wait for the start timewhile(g_CurrentTime != pPerson-m_nStartTime)printf(Writer %d

13、 is Requesting .n,pPerson-m_nID);printf(nn*n);WaitForSingleObject(g_hWriteSemaphore,INFINITE);/ modify the writers real start timepPerson-m_nStartTime = g_CurrentTime;printf(Writer %d is Writting the Shared Buffer.n,pPerson-m_nID);while(g_CurrentTime m_nStartTime + pPerson-m_nWorkTime)printf(Writer

14、%d is Exit.n,pPerson-m_nID);printf(nn*n);/g_NumOfWriteRequest-;ReleaseSemaphore(g_hWriteSemaphore,1,NULL);if(pPerson-m_nID = 4) finished = true;/所有的读写完成ExitThread(0);return 0;bool CreateReader(int StartTime,int WorkTime,int ID)DWORD dwThreadID;if(g_NumPerson = MAX_PERSON)return false;Person *pPerson

15、 = &g_Personsg_NumPerson;pPerson-m_nID = ID;pPerson-m_nStartTime = StartTime;pPerson-m_nWorkTime = WorkTime;pPerson-m_nType = READER;g_NumPerson+;/ Create an New ThreadpPerson-m_hThread= CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);if(pPerson-m_hThread = NULL)return false;return tru

16、e;bool CreateWriter(int StartTime,int WorkTime,int ID)DWORD dwThreadID;if(g_NumPerson = MAX_PERSON) return false;Person *pPerson = &g_Personsg_NumPerson;pPerson-m_nID = ID;pPerson-m_nStartTime = StartTime;pPerson-m_nWorkTime = WorkTime;pPerson-m_nType = WRITER;g_NumPerson+;/ Create an New ThreadpPer

17、son-m_hThread= CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThreadID);if(pPerson-m_hThread = NULL)return false;return true; 4、运行结果 测试数据文件包括n 行测试数据,分别描述创建的n 个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R 表示读者是,W 表示写者。第三字段为一个正数,表示读写操作的开始时间。线程创建后,延时相应时间(单位为秒)

18、后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。下面是一个测试数据文件的例子:1, W,4, 5, 2, W, 16, 4, 3, R, 5, 2, 4, W, 6, 5, 5, R, 4, 3,在读者写者同时在队列中等待申请资时,读者优先调用资源。而且如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作,即读读允许。5、总结通过本次实验“读者-写者问题的实现”的学习对线程及其同步机制有了进一步的学习和掌握,并认识到同步可以保证在一个时间内只有一个线程对

19、某个资源有控制权。也使我对于linux有了全面的接触和了解,而linux所开放的源码的确为学计算机的人提供了很好的平台。对程序设计思想也有了系统的设计的构想,为今后的程序设计奠定了基础。总体而言,这次通过“读者-写者问题”这一经典的线程同步问题,对读者写者问题的编写让我对同步机构应用有了深入的了解,懂得了运用信号量实现进程间的互斥,也学会了如何实现不让共享资源同时修改。 本次试验也使我对C语言有了一个很好的复习和学习,对线程的创建及同步问题及其同步对象都有了很好的理解。并能初步进行简单的程序编程,对程序的调式过程也使我更好了解到线程同步的具体运行过程,我也能够更好的理解程序。学习语言是一个漫长的过程,我想只有在不断的实践练习中,才能更好的掌握编程的技巧,提高自己的编程能力,此次实验让我深深体会到自己还有很多东西需要学习。6、参考文献 1操作系统原理(第三版) 主编:张尧学 出版社:清华大学出版社2操作系统实验教程 主编:张丽芬,刘利雄 出版社:清华大学出版社3操作系统教程 主编:孙钟秀 出版社:高等教育出版社

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com