您好,欢迎访问三七文档
2012--2013学年第一学期学院综合设计《读者与写者问题》学号:姓名:成绩:评语:设计要求:用P、V操作实现读者写者问题,写者不多于5个,读者不多于20个。所有读者和写者访问同一个文件all.txt,每个写者向文件添加一行,内容是“I'mthewriternumberX.ItisTIME.”,其中X是pid,TIME是访问文件的时间,格式为hh-mm-ss.ddd;每个读者读出最后一个写者的pid和写的时间,并在屏幕上输出。每个读者或写者的访问次数为32-100之间的随机数,同一个写者相邻两次的访问间隔不得短于0.1秒,同一个读者相邻两次的访问间隔不得短于0.05秒。装订线1目录1、概述.................................................................................................21.1设计题目.....................................................................................................................21.2设计目的........................................................................................................21.3开发环境.........................................................................................................21.4设计要求.....................................................................................................................22、设计思想.........................................................................................23、具体程序实现.................................................................................24、运行结果.........................................................................................65、总结.................................................................................................86、参考文献.........................................................................................92读者写者问题的实现1、概述1.1设计题目读者写者问题的实现1.2设计目的通过对操作系统内核实现代码的阅读、修改、设计,理解和掌握复杂的操作系统的工作原理。通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。1.3开发环境使用的操作系统:Linux系统使用的编程语言:C语言1.4设计要求用P、V操作实现读者写者问题,写者不多于5个,读者不多于20个。所有读者和写者访问同一个文件all.txt,每个写者向文件添加一行,内容是“I'mthewriternumberX.ItisTIME.”,其中X是pid,TIME是访问文件的时间,格式为hh-mm-ss.ddd;每个读者读出最后一个写者的pid和写的时间,并在屏幕上输出。每个读者或写者的访问次数为32-100之间的随机数,同一个写者相邻两次的访问间隔不得短于0.1秒,同一个读者相邻两次的访问间隔不得短于0.05秒。2、设计思想读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:(1)任意多个读进程可以同时读这个文件;(2)一次只有一个写进程可以往文件中写;(3)如果一个写进程正在进行操作,禁止任何读进程度文件。3、具体程序实现#includewindows.h#includectype.h3#includestdio.h#includestring.h#includestdlib.h#includemalloc.h#defineMAX_PERSON100#defineREADER0//读者#defineWRITER1//写者#defineEND-1#defineRREADER#defineWWRITERtypedefstruct_Person{HANDLEm_hThread;//定义处理线程的句柄intm_nType;//进程类型(读写)intm_nStartTime;//开始时间intm_nWorkTime;//运行时间intm_nID;//进程号}Person;Persong_Persons[MAX_PERSON];intg_NumPerson=0;longg_CurrentTime=0;//基本时间片数intg_PersonLists[]={//进程队列1,W,4,5,2,W,16,4,3,R,5,2,4,W,6,5,5,R,4,3,END,};intg_NumOfReading=0;intg_NumOfWriteRequest=0;//申请写进程的个数HANDLEg_hReadSemaphore;//读者信号HANDLEg_hWriteSemaphore;//写者信号boolfinished=false;//所有的读完成//boolwfinished=false;//所有的写完成voidCreatePersonList(int*pPersonList);boolCreateReader(intStartTime,intWorkTime,intID);boolCreateWriter(intStartTime,intWorkTime,intID);DWORDWINAPIReaderProc(LPVOIDlpParam);DWORDWINAPIWriterProc(LPVOIDlpParam);intmain(){g_hReadSemaphore=CreateSemaphore(NULL,1,100,NULL);//创建信号灯,当前可的资源数为,最大为4g_hWriteSemaphore=CreateSemaphore(NULL,1,100,NULL);//创建信号灯,当前可用的资源数为,最大为CreatePersonList(g_PersonLists);//CreateAllthereaderandwritersprintf(Createdallthereaderandwriter\n...\n);g_CurrentTime=0;while(true){g_CurrentTime++;Sleep(300);//300msprintf(CurrentTime=%d\n,g_CurrentTime);if(finished)return0;system(pause);}//return0;}voidCreatePersonList(int*pPersonLists){inti=0;int*pList=pPersonLists;boolRet;while(pList[0]!=END){switch(pList[1]){caseR:Ret=CreateReader(pList[2],pList[3],pList[0]);//351,w452,523,654break;caseW:Ret=CreateWriter(pList[2],pList[3],pList[0]);break;}if(!Ret)printf(CreatePerson%diswrong\n,pList[0]);pList+=4;//movetonextpersonlist}}DWORDWINAPIReaderProc(LPVOIDlpParam)//读过程{Person*pPerson=(Person*)lpParam;//waitforthestarttimewhile(g_CurrentTime!=pPerson-m_nStartTime){}printf(Reader%disRequesting...\n,pPerson-m_nID);printf(\n\n************************************************\n);//waitforthewriterequest5WaitForSingleObject(g_hReadSemaphore,INFINITE);if(g_NumOfReading==0){WaitForSingleObject(g_hWriteSemaphore,INFINITE);}g_NumOfReading++;ReleaseSemaphore(g_hReadSemaphore,1,NULL);pPerson-m_nStartTime=g_CurrentTime;printf(Reader%disReadingtheSharedBuffer...\n,pPerson-m_nID);printf(\n\n************************************************\n);while(g_CurrentTime=pPerson-m_nStartTime+pPerson-m_nWorkTime){}printf(Reader%disExit...\n,pPerson-m_nID);printf(\n\n************************************************\n);WaitForSingleObject(g_hReadSemaphore,INFINITE);g_NumOfReading--;if(g_NumOfReading==0){ReleaseSemaphore(g_hWriteSemaphore,1,NULL);//此时没有读者,可以写}ReleaseSemaphore(g_hReadSemaphore,1,NULL);if(pPerson-m_nID==4)finished=true;//所有的读写完成ExitThread(0);return0;}DWORDWINAPIWriterProc(LPVOIDlpParam){Person*pPerson=(Person*)lpParam;//waitforthestarttimewhile(g_CurrentTime!=pPerson-m_nStartTime){}printf(Writer%disRequesting...\n,pPerson-m_nID);printf(\n\n************************************************\n);WaitForSingleObject(g_hWriteSemaphore,INFINITE);//modifythewriter'srealstarttimepPerson-m_nStartTime=g_CurrentTime;printf(Writer%disWrittingtheSharedBuffer...\n,pPerson-
本文标题:读者与写者问题
链接地址:https://www.777doc.com/doc-1812543 .html