资源描述:
《操作系统实验 读者写者问题.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、《计算机操作系统》实验报告题目读者写者问题学院(部)信息学院专业计算机科学与技术班级学生姓名学号指导教师(签字)一、问题描述一个数据文件或者记录,可以被多个进程共享,我们把只要求读该文件的进程称为“Reader进程”,其他进程则称为“Writer进程”。允许多个进程同时读一个共享对象,因为读操作不会是数据文件混乱。但不允许一个Writer进程和其他Reader进程或者Writer进程同时访问共享对象,因为这种访问将会引起混乱。所谓“读者——写着问题(Reader—WriterProblem)”是指保证一个Writer进程必须与其他进程互斥地访问共享对象的同步
2、问题二、解决问题为实现Reader与Writer进程间在读或写是的互斥而设置了一个互斥的信号量Wmutex。另外,在设置一个整型变量Readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer去写。因此,仅当Readercount=0时,表示尚无Reader进程在读时,Reader进程才需要进行Wait(wmutex)操作。若Wait(Wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。同理,仅当Reader进程在执行了Readercount-1操作后其值为0时,才执行Signal(Wm
3、utex)操作,以便让Writer进程写。又因为Readercount是一个可被多个Reader进程访问的临界资源,因此也应该为它设置一个互斥信号量rmutex。三、代码实现1、读者优先#include#includeusingnamespacestd;CRITICAL_SECTIONrmutex,wmutex;intwr;intreadernum;DWORDWINAPIreader(LPVOIDIpParamter){cout<<"读者申请";wr++;EnterCriticalSection(&rmutex)
4、;if(readernum==0)EnterCriticalSection(&wmutex);readernum++;cout<<"读者进入成功正在读取";LeaveCriticalSection(&rmutex);Sleep(2000);EnterCriticalSection(&rmutex);readernum--;cout<<"读者退出";wr--;if(readernum==0)LeaveCriticalSection(&wmutex);LeaveCriticalSection(&rmutex);return0;}DWORDWINAPIwr
5、iter(LPVOIDPM){cout<<"写者申请";while(wr!=0){}EnterCriticalSection(&wmutex);cout<<"写者已进入正在写入";Sleep(500);cout<<"写者退出";LeaveCriticalSection(&wmutex);return0;}intmain(){readernum=0;wr=0;InitializeCriticalSection(&rmutex);InitializeCriticalSection(&wmutex);HANDLEhr[5];//定义读者线程HANDLE
6、hw[5];//定义写者线程//intthnum;intdrn=0;//输入的读者个数intdwn=0;//输入的写者个数cout<<"输入读者写者线程1代表读者2代表写者0代表结束"<>th[num];while(th[num]){if(th[num]==1){drn++;}if(th[num]==2){dwn++;}num++;cin>>th[num];}inthr1=0,hw1=0;for(intj=0;j!=num;j++){if(th[j]==1){hr[hr1]=CreateThread(
7、NULL,0,reader,NULL,0,NULL);hr1++;}if(th[j]==2){hw[hw1]=CreateThread(NULL,0,writer,NULL,0,NULL);hw1++;}}WaitForMultipleObjects(drn,hr,TRUE,INFINITE);WaitForMultipleObjects(dwn,hw,TRUE,INFINITE);for(inti=0;i!=drn;i++){CloseHandle(hr[i]);}for(inti=0;i!=dwn;i++){CloseHandle(hw[i]);}Del
8、eteCriticalSection(&rmutex