读者—写者问题程序设计.doc_第1页
读者—写者问题程序设计.doc_第2页
读者—写者问题程序设计.doc_第3页
读者—写者问题程序设计.doc_第4页
读者—写者问题程序设计.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上 机 实 验 报 告 指导教师: 课程名称Linux系统程序设计实验日期2013.07.01-07.05专业班级计算机11-5班姓名学号实验题目读者写者问题程序设计实验序号 1实验地点A604实验目的了解进程同步的问题,理解信号量机制的原理,掌握信号量解决同步问题的方法,进而学会进程的同步与互斥。实验任务及要求 用n 个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。读者-写者问题的读写操作限制:1)写-写互斥;2)读-写互斥;3)读-读允许;写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。实验内容(步骤、表格、算法或流程图等)概要设计:(1)控制流程用CheckPersonList(PersonLists)函数检查PersonLists中是否有为创建的进程(读写者)。如果有则创建相应的读写线程(2)创建读写者用bool CreateReader(int StartTime,int WorkTime)函数创建读者写者相应的线程,其中由windows提供的函数为CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);返回的是DWORD型变量。在CreateReader(int StartTime,int WorkTime)中还会初始化相应的读写者的基本信息,例如何时申请数据何时读数据何时关闭线程等等。(3)读写者进程参见图2.1读者-写者的完整流程图。(4)同步与互斥WaitForSingleObject(信号量名字,infinite)和ReleaseSemaphore(信号量名字,1,null)用于实现同步于互斥,执行WaitForSingleObject(信号量名字,infinite)信号量相应的信号量减1,执行ReleaseSemaphore(信号量名字,1,null)恢复1。 源程序及注释(不足可加附页)/写者优先算法#include #include #include #include #include #include #define MAX_PERSON 10#define READER 0#define WRITER 1#define END -1#define R READER#define W WRITER typedef struct _PersonHANDLE Thread;int Type;int StartTime;int WorkTime;int ID;Person; Person PersonsMAX_PERSON;int NumPerson = 0;long CurrentTime= 0;int PersonLists = 1,R,1,3,2,W,2,5,/*读写互斥*/3,W,5,5,/*写写互斥*/4,R,3,5,/*写读互斥*/5,R,15,2,/*读读不互斥*/END,;int rfirst = 0;int wfirst = 0;int NumOfReaders = 0;int NumOfWriters = 0;HANDLE rsem;/*初值为1的互斥信号量,在至少有一个写者准备访问数据时就不允许随后来的读者访问数据*/HANDLE wsem;/*初值为1的互斥信号量,之后有一个写者访问数据时其他写者和读者就被阻止对数据的访问*/HANDLE z;/*初值为1的互斥信号量,在至少有一个写着准备访问数据、且后面已经来一个读者时再来的读者将在这个信号量上等待*/HANDLE ReadMutex;/*创建写者的互斥信号量,初值为1*/HANDLE WriteMutex;/*创建读者的互斥信号量, 初值为1*/void CheckPersonList(int *pPersonList);/*查看人数,为创建读写者线程*/bool CreateReader(int StartTime,int WorkTime);bool CreateWriter(int StartTime,int WorkTime);DWORD WINAPI ReaderProc(LPVOID lpParam);/*读者进程程序*/DWORD WINAPI WriterProc(LPVOID lpParam);/*写着进程程序*/#include Writerprior.hint main()rsem= CreateSemaphore(NULL,1,1,NULL);wsem= CreateSemaphore(NULL,1,1,NULL);z= CreateSemaphore(NULL,1,1,NULL); ReadMutex= CreateSemaphore(NULL,1,1,NULL); WriteMutex= CreateSemaphore(NULL,1,1,NULL);CurrentTime = 0;while(true)/模拟20个时钟周期CheckPersonList(PersonLists);CurrentTime+;Sleep(600);printf(当前时间 = %d:n,CurrentTime);if(CurrentTime=20)break;system(pause);CloseHandle(rsem);CloseHandle(wsem);CloseHandle(z);CloseHandle(ReadMutex);CloseHandle(WriteMutex);return 0; void CheckPersonList(int *pPersonLists)int i=0;int *pList = pPersonLists;bool P;while(pList0 != END)if(pList2 = CurrentTime)switch(pList1)case R:P = CreateReader(pList2,pList3);/创建一个读者break;case W:P = CreateWriter(pList2,pList3);/创建一个写者break;if(!P)printf(Create Person %d is wrongn,pList0);pList += 4; / 数组的指针指向第二个人 DWORD WINAPI ReaderProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;pPerson-ID = +NumOfReaders;WaitForSingleObject(z,INFINITE);/P(z),其余读者在此排队printf(tt读者 %d 申请读数据.n,pPerson-ID);WaitForSingleObject(rsem,INFINITE);/P(rsem),一个读者与一个写着再次竞争数据的使用权/printf(Reader %d is requesting the Shared Buffer.n,pPerson-ID); WaitForSingleObject(ReadMutex,INFINITE);/P(ReadMutex),读者请求进入rfirst临界区rfirst+; if(rfirst = 1)/是否是第一个读者 WaitForSingleObject(wsem,INFINITE);/读者在此处与写者进行同步 ReleaseSemaphore(ReadMutex,1,NULL);/退出rfirst临界区,V(ReadMutex)ReleaseSemaphore(rsem,1,NULL);ReleaseSemaphore(z,1,NULL);/V(z)/ 读取所需数据,将现在时间赋值给读者,用以计算结束时间printf(tt读者 %d 申请成功n,pPerson-ID);pPerson-StartTime = CurrentTime; printf(tt读者 %d 正在读数据.n,pPerson-ID);while(CurrentTime StartTime + pPerson-WorkTime)/ 模拟读数据printf(tt读者 %d 读完数据退出n,pPerson-ID);WaitForSingleObject(ReadMutex,INFINITE); rfirst-; if(rfirst = 0) /是最后一个读者? ReleaseSemaphore(wsem,1,NULL);/没有读者了,写者放行 ReleaseSemaphore(ReadMutex,1,NULL);/退出读者临界区 ExitThread(0);/关闭读者线程return 0;DWORD WINAPI WriterProc(LPVOID lpParam)/写者进程程序Person *pPerson = (Person*)lpParam;pPerson-ID = +NumOfWriters; printf(tt写者 %d 正在申请写数据.n,pPerson-ID); WaitForSingleObject(WriteMutex,INFINITE);/请求进入写者临界区wfirst=wfirst+;if(wfirst=1)WaitForSingleObject(rsem,INFINITE);/一个写者在此与读者取得同步ReleaseSemaphore(WriteMutex,1,NULL);/退出rfirst临界区WaitForSingleObject(wsem,INFINITE);/其他写者在此等候进入写临界区 / 读取所需数据,将现在时间赋值给读者,用以计算结束时间pPerson-StartTime = CurrentTime; printf(tt写者 %d 正在写数据.n,pPerson-ID);while(CurrentTime StartTime + pPerson-WorkTime)/模拟写数据printf(tt写者 %d 写完数据退出n,pPerson-ID);ReleaseSemaphore(wsem,1,NULL);/退出进入写临界区WaitForSingleObject(WriteMutex,INFINITE);/请求进入wfirst临界区wfirst=wfirst-;if(wfirst=0)/是最后一个写者?ReleaseSemaphore(rsem,1,NULL);/没有写者了,向读者放行ReleaseSemaphore(WriteMutex,1,NULL);/退出wfirst临界区ExitThread(0);/关闭写者线程return 0; bool CreateReader(int StartTime,int WorkTime)DWORD dwThreadID;Person *pPerson = &PersonsNumPerson;pPerson-StartTime= StartTime;pPerson-WorkTime= WorkTime;pPerson-Type= READER; NumPerson+; / 创建一个读者的新线程pPerson-Thread = CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);if(pPerson-Thread = NULL) return false; return true; bool CreateWriter(int StartTime,int WorkTime)DWORD dwThreadID;if(NumPerson = MAX_PERSON)return false;Person *pPerson = &

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论