您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 实验一--读写者问题
实验一读者-写者问题模拟实现一、实验题目模拟实现读者-写者问题二、实验目的通过模拟实现经典的读者——写者问题,巩固对同步机制的学习,学会运用信号量、PV原语处理进程间的同步和互斥。三、实验要求设计实现读者-写者问题模拟程序。在Windowsxp环境下,创建一个控制台程序,此程序包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先或写者优先的读者-写者问题。[提示]:1、读者-写者问题的读写操作限制(包括读者优先和写者优先):1)写-写互斥,即不能有两个写者同时进行写操作。2)读-写互斥,即不能同时有一个线程在读,而另一个线程在写。,3)读-读允许,即可以有一个或多个读者在读。•如果读者来:–无读者、写者,新读者可以读–有写者等待,但有其他读者正在读,新读者可以读–有写者写,新读者等•如果写者来:–无读者,新写者可以写–有读者,新写者等待–有其他写者,新写者等待读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。2、P、V操作如下•读者:BEGINP(mutex);//上锁,互斥其他读者,为了保证只有一个读者改变read_countread_count:=read_count+1;IFread_count=1//第一个读者,则上写者的锁,保证读得时候不能让写者写THENP(writer)V(mutex);读文件;P(mutex);//同上,互斥读者,为了保证只有一个读者改变read_countread_count:=read_count-1;IFread_count=0//最后一个读者,signal写者,可以写THENV(write);V(mutex);END;•写者:BEGINP(write);写文件;V(write);END;四、实验报告提纲1、实验题目及要求。2、程序中使用的数据结构及windowsAPI函数说明。如:CreateSemaphore()WaitForSingleObject()ReleaseSemaphore()CreateThread()Sleep()system(pause);等3、程序调试(按照以下测试数据要求进行调试并截图表示)(1)测试数据文件格式测试数据文件包括n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各个字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R表示读者,w表示写者。第三字段为一个正数,表示读写操作的开始时间:线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。下面是一个测试数据文件的例子:1,W,3,5,2,W,16,5,3,R,5,2,4,W,6,5,5,R,4,36,R,11,4(2)运行结果显示要求利用以上测试数据要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。4、结果分析和讨论。5、附一份源程序并附上注释。实验要求(二者选一):1、参考“代码参考”(见下页)代码设计内容,对程序进行必要的修改并加注释。按要求完成实验报告2、自己动手设计数据结构,并完成程序代码,代码正确无误,实验报告完整。代码参考#includewindows.h#includectype.h#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;//所有的读完成voidCreatePersonList(int*pPersonList);boolCreateReader(intStartTime,intWorkTime,intID);boolCreateWriter(intStartTime,intWorkTime,intID);DWORDWINAPIReaderProc(LPVOIDlpParam);DWORDWINAPIWriterProc(LPVOIDlpParam);intmain(){g_hReadSemaphore=CreateSemaphore(NULL,1,100,NULL);//创建信号量g_hWriteSemaphore=CreateSemaphore(NULL,1,100,NULL);//创建信号量CreatePersonList(g_PersonLists);//CreateAllthereaderandwritersprintf(Createdallthereaderandwriter\n...\n);g_CurrentTime=0;while(true){g_CurrentTime++;Sleep(100);//100msprintf(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]);//break;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);//waitforthewriterequestWaitForSingleObject(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-m_nID);while(g_CurrentTime=pPerson-m_nStartTime+pPerson-m_nWorkTime){}printf(Writer%disExit...\n,pPerson-m_nID);printf(\n\n************************************************\n);//g_NumOfWriteRequest--;ReleaseSemaphore(g_hWriteSemaphore,1,NULL);if(pPerson-m_nID==4)finished=true;//所有的读写完成ExitThread(0);return0;}boolCreateReader(intStartTime,intWorkTime,intID){DWORDdwThreadID;if(g_NumPerson=MAX_PERSON)returnfalse;Person*pPerson=&g_Persons[g_NumPerson];pPerson-m_nID=ID;pP
本文标题:实验一--读写者问题
链接地址:https://www.777doc.com/doc-7217543 .html