操作系统实验 读者写者问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机操作系统》实验报告
题目读者写者问题
学院(部)信息学院
专业计算机科学与技术
班级
学生姓名
学号
指导教师(签字)
一、问题描述
一个数据文件或者记录,可以被多个进程共享,我们把只要求读该文件的进程称为“Reader进程”,其他进程则称为“Writer进程”。允许多个进程同时读一个共享对象,因为读操作不会是数据文件混乱。但不允许一个Writer进程和其他Reader进程或者Writer进程同时访问共享对象,因为这种访问将会引起混乱。所谓“读者——写着问题(Reader—Writer Problem)”是指保证一个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
#include
using namespace std;
CRITICAL_SECTION rmutex,wmutex;
int wr;
int readernum;
DWORD WINAPI reader(LPVOID IpParamter){
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);
return 0;
}
DWORD WINAPI writer(LPVOID PM){
cout<<"写者申请\n";
while(wr!=0){
}
EnterCriticalSection(&wmutex);
cout<<"写者已进入正在写入\n";
Sleep(500);
cout<<"写者退出\n";
LeaveCriticalSection(&wmutex);
return 0;
}
int main(){
readernum=0;
wr=0;
InitializeCriticalSection(&rmutex);
InitializeCriticalSection(&wmutex);
HANDLE hr[5];//定义读者线程
HANDLE hw[5];//定义写者线程
//int thnum;
int drn=0; //输入的读者个数
int dwn=0; //输入的写者个数
cout<<"输入读者写者线程1代表读者2代表写者0代表结束"< int th[10]; int num=0; cin>>th[num]; while(th[num]){ if(th[num]==1){ drn++; } if(th[num]==2){ dwn++; } num++; cin>>th[num]; } int hr1=0,hw1=0; for(int j=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(int i=0;i!=drn;i++){ CloseHandle(hr[i]); } for(int i=0;i!=dwn;i++){ CloseHandle(hw[i]); } DeleteCriticalSection(&rmutex); DeleteCriticalSection(&wmutex); return 0; } 2、写者优先 #include #include using namespace std; CRITICAL_SECTION rmutex,wmutex; int ww; int readernum; DWORD WINAPI reader(LPVOID IpParamter){ 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)