读者写者问题写者优先参考答案完整版.docx

上传人:b****3 文档编号:4834844 上传时间:2022-12-10 格式:DOCX 页数:7 大小:16.37KB
下载 相关 举报
读者写者问题写者优先参考答案完整版.docx_第1页
第1页 / 共7页
读者写者问题写者优先参考答案完整版.docx_第2页
第2页 / 共7页
读者写者问题写者优先参考答案完整版.docx_第3页
第3页 / 共7页
读者写者问题写者优先参考答案完整版.docx_第4页
第4页 / 共7页
读者写者问题写者优先参考答案完整版.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

读者写者问题写者优先参考答案完整版.docx

《读者写者问题写者优先参考答案完整版.docx》由会员分享,可在线阅读,更多相关《读者写者问题写者优先参考答案完整版.docx(7页珍藏版)》请在冰豆网上搜索。

读者写者问题写者优先参考答案完整版.docx

读者写者问题写者优先参考答案完整版

HUAsystemofficeroom【HUA16H-TTMS2A-HUAS8Q8-HUAH1688】

 

读者写者问题写者优先参考答案

【写者优先】在读者、写者问题中,如果总有读者进程进行读操作,会造成写者进程永远都不能进行写操作(读者优先),即所谓的写者饿死现象。

给出读者、写者问题的另一个解决方案:

即保证当有一个写者进程想写时,不允许读者进程再进入,直到写者写完为止,即写者优先。

让我们先回顾读者写者问题[1]:

一个数据对象若被多个并发进程所共享,且其中一些进程只要求读该数据对象的内容,而另一些进程则要求写操作,对此,我们把只想读的进程称为“读者”,而把要求写的进程称为“写者”。

在读者、写者问题中,任何时刻要求“写者”最多只允许有一个执行,而“读者”则允许有多个同时执行。

因为多个“读者”的行为互不干扰,他们只是读数据,而不会改变数据对象的内容,而“写者”则不同,他们要改变数据对象的内容,如果他们同时操作,则数据对象的内容将会变得不可知。

所以对共享资源的读写操作的限制条件是:

允许任意多的读进程同时读;

一次只允许一个写进程进行写操作;

如果有一个写进程正在进行写操作,禁止任何读进程进行读操作。

为了解决该问题,我们只需解决“写者与写者”和“写者与第一个读者”的互斥问题即

可,为此我们引入一个互斥信号量Wmutex,为了记录谁是第一个读者,我们用一个共享整

型变量Rcount作一个计数器。

而在解决问题的过程中,由于我们使用了共享变量Rcount,

该变量又是一个临界资源,对于它的访问仍需要互斥进行,所以需要一个互斥信号量Rmutex,

算法如下:

semaphoreWmutex,Rmutex=1;

intRcount=0;

voidreader()/*读者进程*/

{

while(true)

{

P(Rmutex);

if(Rcount==0)P(wmutex);

Rcount=Rcount+1;

V(Rmutex);

;

read;/*执行读操作*/

;

P(Rmutex);

Rcount=Rcount-1;

if(Rcount==0)V(wmutex);

V(Rmutex);

}

}

voidwriter()/*写者进程*/

{

while(true)

{

P(Wmutex);

;

write;/*执行写操作*/

;

P(Wmutex);

}

}

现在回到【写者优先】优先问题

【写者优先】在读者、写者问题中,如果总有读者进程进行读操作,会造成写者进程永远都不能进行写操作(读者优先),即所谓的写者饿死现象。

给出读者、写者问题的另一个解决方案:

即保证当有一个写者进程想写时,不允许读者进程再进入,直到写者写完为止,即写者优先。

【解题思路】在上面的读者写者问题基础上,做以下修改:

增加授权标志authFlag,当写者到来,发现有读者在读,则取消授权,然后等待缓冲区;

增加“等待授权计数器waitAuthCount”,写者离开时,如果waitAuthCount大于0,则迭代唤醒等待授权的读者;

读者到来,首先看授权标志,如果有授权标志,则继续,否则等待授权,即写者取消授权后,新来的读者不能申请缓冲区。

增加Amutex互斥信号量,保护waitAuthCount、authFlag

增加同步信号量mutexAuth,表示等待授权的读者队列

【伪代码如下】

semaphoreWmutex=1,Rmutex=1,Amutex=1,mutexAuth=0;

intRcount=0;

intwaitAuthCount=0;

intauthFlag=1;

voidreader()/*读者进程*/

{

P(Amutex)//临界资源authFlag和waitAuthCount互斥

if(authFlag==0)

{

waitAuthCount++;

p(mutexAuth);

}

V(Amutex)

P(Rmutex);//临界资源Rcount互斥

if(Rcount==0)P(wmutex);//缓冲区互斥

Rcount=Rcount+1;

V(Rmutex);

......;

read;/*执行读操作*/

......;

P(Rmutex);

Rcount=Rcount-1;

if(Rcount==0)

V(wmutex);

V(Rmutex);

}

}

voidwriter()/*写者进程*/

{

if(Rcount>0)

authFlag=0;

P(Wmutex);

......;

write;/*执行写操作*/

......;

P(Wmutex);

P(Amutex)

while(waitAuthCount>0){

v(mutexAuth);

waitAuthCount--;

}

V(Amutex)

}

【vc++代码】

//testsemaphore.cpp:

Definestheentrypointfortheconsoleapplication.

//by西南大学计算机科学系周竹荣

//

#include"stdafx.h"

#include"windows.h"

#include"process.h"

#include

#include

usingnamespacestd;

#defineP(S)WaitForSingleObject(S,INFINITE)//定义Windows下的P操作

#defineV(S)ReleaseSemaphore(S,1,NULL)//定义Windows下的V操作

HANDLEWmutex,Rmutex,Authmutex,Amutex;

intRcount=0;

intwaitAuthCount=0;

intauthFlag=1;

DWORDWINAPIreader(){

P(Amutex);

if(authFlag==0)

{

waitAuthCount++;

cout<<"等待授权,线程ID:

"<

P(Authmutex);

}

V(Amutex);

P(Rmutex);

if(Rcount==0)

P(Wmutex);

Rcount=Rcount+1;

V(Rmutex);

cout<<"读数据,线程ID:

"<

Sleep(500);/*执行读操作*/

P(Rmutex);

Rcount=Rcount-1;

if(Rcount==0)

V(Wmutex);

V(Rmutex);

return1;

};

DWORDWINAPIwriter(){

if(Rcount>0)

{

cout<<"取消授权,线程ID:

"<

authFlag=0;

}

P(Wmutex);

cout<<"写数据,线程ID:

"<

Sleep(2000);/*执行写操作*/

V(Wmutex);

cout<<"授权读,线程ID:

"<

P(Amutex);

authFlag=1;

while(waitAuthCount>0){

V(Authmutex);

waitAuthCount--;

}

V(Amutex);

return1;

};

intmain(intargc,char*argv[])

{

Wmutex=CreateSemaphore(NULL,1,1,NULL);

Rmutex=CreateSemaphore(NULL,1,1,NULL);

Authmutex=CreateSemaphore(NULL,1,1,NULL);

Amutex=CreateSemaphore(NULL,1,1,NULL);

while

(1){

Sleep(100);

srand((unsigned)time(NULL));

intrC=rand()%1000;

Sleep(rC);

if(rC%6==0)

CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)writer,NULL,NULL,NULL);

else

CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)reader,NULL,NULL,NULL);

}

Sleep(600000);

return0;

}

【运行结果】

参考文献

[1]计算机操作系统-郁红英-冯庚豹-人民邮电出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1