1、读者写者问题实验报告操作系统实验报告实验序号:操作系统实验(二) 实验项目名称:读者写者问题 学号姓名队别实验地点指导教员实验时间一、实验目的及要求实验目的:综合运用多进程并发控制,进程同步互斥,信号量机制等原理解决问题。实验要求:本题目安排16学时,要求党员根据题目要求,写出算法,在平台上进行程序设计和调试,在运行成功的基础上,整理出源程序和运行结果写出设计报告。二、实验设备(环境)实验设备: WINDOWS 2000环境、VC平台、WIN 32 API三、实验内容与步骤实验内容与步骤:可以将所有读者和写者分别存于一个读者等待队列和一个写者等待队列,每当读允许时,就从读者队列中释放一个或多个
2、读者线程进行读操作;每当写允许时,就从写者队列中释放一个写者进行写操作a)读者优先读者优先指的是除非有写者在写文件,否则读者不需要等待所以可以用一个整形变量记录当前读者的数目,用于确定是否需要释放正在等待的写者线程每一个读者开始读文件时,必须修改变量因此需要一个互斥对象mutex来实现对全局变量修改时的互斥另外,为了实现写互斥,需要增加一个临界区对象write.当写者发出写请求时,必须申请临界区对象的所有权通过这种方法,也可以实现读写互斥,当read_count=1时,读者线程也必须申请临界区对象的所有权当读者拥有临界区所有权时,写者阻塞在临界区对象write上当写者拥有临界区所有权时,第一个
3、读者判断完”read_count=1”后阻塞在write上,其余的读者由于等待对read_count的判断,阻塞在mutex上b)写者优先写者优先与读者优先类似不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作为此应当添加一个整形变量write_count,用于记录正在等待的写者的数目,当write_count=0时,才可以释放等待的读者线程队列为了对全局变量write_count实现互斥,必须增加一个对象mutex3.为了实现写者优先,应当添加一个临界区对象read,当有写者在写文件或等待时,读者必须阻塞在read上读者线程除了要对
4、全局变量read_count实现操作上的互斥外,还必须有一个互斥对象对阻塞read这一过程实现互斥这两个互斥对象分别命名为mutex1和mutex2。四、实验结果与数据处理源代码#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;/定义处理线程的句
5、柄int m_nType;/进程类型(读写)int m_nStartTime;/开始时间int m_nWorkTime;/运行时间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
6、 = 0;/申请写进程的个数HANDLE g_hReadSemaphore;/读者信号HANDLE g_hWriteSemaphore;/写者信号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 Reader
7、Proc(LPVOID lpParam);DWORD WINAPI WriterProc(LPVOID lpParam);int 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
8、 all the reader and writern.n);g_CurrentTime = 0;while(true)g_CurrentTime+;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
9、)case R:Ret = CreateReader(pList2,pList3,pList0);/351,w452,523,654break; 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
10、 for the start timewhile(g_CurrentTime != pPerson-m_nStartTime) 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+;ReleaseSemap
11、hore(g_hReadSemaphore,1,NULL);pPerson-m_nStartTime = g_CurrentTime;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);
12、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);return 0;DWORD WINAPI WriterProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;/ wait for the start t
13、imewhile(g_CurrentTime != pPerson-m_nStartTime)printf(Writer %d 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(
14、g_CurrentTime m_nStartTime + pPerson-m_nWorkTime)printf(Writer %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 dwTh
15、readID;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 = READER;g_NumPerson+;/ Create an New ThreadpPerson-m_hThread= CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&
16、dwThreadID);if(pPerson-m_hThread = NULL)return false;return true;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;p
17、Person-m_nType = WRITER;g_NumPerson+;/ Create an New ThreadpPerson-m_hThread= CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThreadID);if(pPerson-m_hThread = NULL)return false;return true; 五、分析与讨论通过这次课程设计,让我对课本上的理论知识有了更深刻的认识,通过自己的动手实践,把理论知识真正的化为了自己可以应用的技能在这次实验中也遇到了不少困难,往往一个小小的错误,就会导致整个程序不能正常运行,寻找错误、发现错误和修改错误,每一次改进都需要花费大量的时间和精力,每取得一次小的成功都离最后的成功更近了一步,每一次改正也会带来巨大的欣喜,这正是一个进步和提高的过程在这个过程中获得了很多收获六、教员评语签名:日期:成绩
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1