操作系统实验 读者写者问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档