




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统实验-读者写者问题操作系统实验-读者写者问题操作系统实验-读者写者问题xxx公司操作系统实验-读者写者问题文件编号:文件日期:修订次数:第1.0次更改批准审核制定方案设计,管理制度《计算机操作系统》实验报告题目读者写者问题学院(部)信息学院专业计算机科学与技术班级学生姓名学号指导教师(签字)问题描述一个数据文件或者记录,可以被多个进程共享,我们把只要求读该文件的进程称为“Reader进程”,其他进程则称为“Writer进程”。允许多个进程同时读一个共享对象,因为读操作不会是数据文件混乱。但不允许一个Writer进程和其他Reader进程或者Writer进程同时访问共享对象,因为这种访问将会引起混乱。所谓“读者——写着问题(Reader—WriterProblem)”是指保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题解决问题为实现Reader与Writer进程间在读或写是的互斥而设置了一个互斥的信号量Wmutex。另外,在设置一个整型变量Readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer去写。因此,仅当Readercount=0时,表示尚无Reader进程在读时,Reader进程才需要进行Wait(wmutex)操作。若Wait(Wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。同理,仅当Reader进程在执行了Readercount-1操作后其值为0时,才执行Signal(Wmutex)操作,以便让Writer进程写。又因为Readercount是一个可被多个Reader进程访问的临界资源,因此也应该为它设置一个互斥信号量rmutex。代码实现1、读者优先#include<iostream>#include<>usingnamespacestd;CRITICAL_SECTIONrmutex,wmutex;intwr;intreadernum;DWORDWINAPIreader(LPVOIDIpParamter){ cout<<"读者申请\n"; wr++; EnterCriticalSection(&rmutex); if(readernum==0) EnterCriticalSection(&wmutex); readernum++; cout<<"读者进入成功正在读取\n"; LeaveCriticalSection(&rmutex); Sleep(2000); EnterCriticalSection(&rmutex); readernum--; cout<<"读者退出\n"; wr--; if(readernum==0) LeaveCriticalSection(&wmutex); LeaveCriticalSection(&rmutex); return0;}DWORDWINAPIwriter(LPVOIDPM){ cout<<"写者申请\n"; while(wr!=0){ } EnterCriticalSection(&wmutex);cout<<"写者已进入正在写入\n"; Sleep(500); cout<<"写者退出\n"; LeaveCriticalSection(&wmutex); return0;}intmain(){ readernum=0; wr=0; InitializeCriticalSection(&rmutex); InitializeCriticalSection(&wmutex); HANDLEhr[5];//定义读者线程 HANDLEhw[5];//定义写者线程 //intthnum; intdrn=0;//输入的读者个数 intdwn=0;//输入的写者个数 cout<<"输入读者写者线程1代表读者2代表写者0代表结束"<<endl; intth[10]; intnum=0; cin>>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(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]); } DeleteCriticalSection(&rmutex); DeleteCriticalSection(&wmutex); return0;}2、写者优先#include<iostream>#include<>usingnamespacestd;CRITICAL_SECTIONrmutex,wmutex;intww;intreadernum;DWORDWINAPIreader(LPVOIDIpParamter){ cout<<"读者申请\n"; while(ww!=0){ } EnterCriticalSection(&rmutex); if(readernum==0){ EnterCriticalSection(&wmutex); } cout<<"读者进入成功正在读取\n"; readernum++; LeaveCriticalSection(&rmutex); Sleep(2000); EnterCriticalSection(&rmutex); readernum--; if(readernum==0) LeaveCriticalSection(&wmutex); cout<<"读者退出\n"; LeaveCriticalSection(&rmutex); return0;}DWORDWINAPIwriter(LPVOIDPM){ ww++; cout<<"写者申请\n"; EnterCriticalSection(&wmutex);cout<<"写者已进入正在写入\n"; Sleep(1000); cout<<"写者退出\n"; ww--; LeaveCriticalSection(&wmutex); return0;}intmain(){ readernum=0; ww=0; InitializeCriticalSection(&rmutex); InitializeCriticalSection(&wmutex); HANDLEhr[5];//定义读者线程 HANDLEhw[5];//定义写者线程 intdrn=0;//输入的读者个数 intdwn=0;//输入的写者个数 cout<<"输入读者写者线程1代表读者2代表写者0代表结束"<<endl; intth[10]; intnum=0; cin>>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(NULL,0,reader,NULL,0,NULL); Sleep(10); hr1++; } if(th[j]==2){ hw[hw1]=CreateThread(NULL,0,writer,NULL,0,NULL); Sleep(10); 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]);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论