读者写着问题.doc
上传人:sy****28 上传时间:2024-09-13 格式:DOC 页数:7 大小:65KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

读者写着问题.doc

读者写着问题.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

读者—写者问题第页共NUMPAGES7页读者写者问题实验二读者写者问题实验报告一、实验目的l用信号量来实现读者写者问题。l学习NachOS的使用方法l理解和运用信号量、PV原语、进程间的同步互斥关系等基本知识。二、实验内容读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:(1)任意多个读进程可以同时读这个文件;(2)一次只有一个写进程可以往文件中写;(3)如果一个写进程正在进行操作,禁止任何读进程度文件。实验要求用信号量来实现读者写者问题的调度算法。实验提供了Semaphore类,该类通过P()、V()两个方法实现了P、V原语的功能。实验的任务是修改Reader类的Read(int)方法以及Writer类的Write(int)方法。我们需要分两种情况实现该问题:Ø读优先:要求指一个读者试图进行读操作时,如果这时正有其他读者在进行操作,他可直接开始读操作,而不需要等待。Ø写优先:一个读者试图进行读操作时,如果有其他写者在等待进行写操作或正在进行写操作,他要等待该写者完成写操作后才开始读操作。三、问题分析在Windows2000环境下,创建一个包含n个线程的控制台进程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。读者-写者问题的读写操作限制:1)写-写互斥;2)读-写互斥;3)读-读允许;读者优先的附加限制:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确信所有处理都遵守相应的读写操作限制。四、实现程序及说明#include<windows.h>#include<ctype.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#defineMAX_PERSON100//最多100人#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,3,5,2,W,16,5,3,R,5,2,4,W,6,5,5,R,4,3,6,R,17,7,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);//创建信号灯,当前可用的资源数为1,最大为100g_hWriteSemaphore=CreateSemaphore(NULL,1,100,NULL);//创建信号灯,当前