读者写者问题_写者优先参考答案.doc

读者写者问题_写者优先参考答案.doc

ID:56818591

大小:82.00 KB

页数:6页

时间:2020-07-13

读者写者问题_写者优先参考答案.doc_第1页
读者写者问题_写者优先参考答案.doc_第2页
读者写者问题_写者优先参考答案.doc_第3页
读者写者问题_写者优先参考答案.doc_第4页
读者写者问题_写者优先参考答案.doc_第5页
资源描述:

《读者写者问题_写者优先参考答案.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、.【写者优先】在读者、写者问题中,如果总有读者进程进行读操作,会造成写者进程永远都不能进行写操作(读者优先),即所谓的写者饿死现象。给出读者、写者问题的另一个解决方案:即保证当有一个写者进程想写时,不允许读者进程再进入,直到写者写完为止,即写者优先。让我们先回顾读者写者问题[1]:一个数据对象若被多个并发进程所共享,且其中一些进程只要求读该数据对象的容,而另一些进程则要求写操作,对此,我们把只想读的进程称为“读者”,而把要求写的进程称为“写者”。在读者、写者问题中,任何时刻要求“写者”最多只允许有一个执行,而“读者”则允许有多个同时执行。因为多个“读者”的行为互不干扰,

2、他们只是读数据,而不会改变数据对象的容,而“写者”则不同,他们要改变数据对象的容,如果他们同时操作,则数据对象的容将会变得不可知。所以对共享资源的读写操作的限制条件是:n允许任意多的读进程同时读;n一次只允许一个写进程进行写操作;n如果有一个写进程正在进行写操作,禁止任何读进程进行读操作。为了解决该问题,我们只需解决“写者与写者”和“写者与第一个读者”的互斥问题即可,为此我们引入一个互斥信号量Wmutex,为了记录谁是第一个读者,我们用一个共享整型变量Rcount作一个计数器。而在解决问题的过程中,由于我们使用了共享变量Rcount,该变量又是一个临界资源,对于它的访问

3、仍需要互斥进行,所以需要一个互斥信号量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);⋯⋯

4、;write;/*执行写操作*/⋯⋯;P(Wmutex);}}现在回到【写者优先】优先问题【写者优先】在读者、写者问题中,如果总有读者进程进行读操作,会造成写者进程永远都不能进行写操作(读者优先),即所谓的写者饿死现象。给出读者、写者问题的另一个解决方案:即保证当有一个写者进程想写时,不允许读者进程再进入,直到写者写完为止,即写者优先。【解题思路】在上面的读者写者问题基础上,做以下修改:n增加授权标志authFlag,当写者到来,发现有读者在读,则取消授权,然后等待缓冲区;n增加“等待授权计数器waitAuthCount”,写者离开时,如果waitAuthCount大于

5、0,则迭代唤醒等待授权的读者;n读者到来,首先看授权标志,如果有授权标志,则继续,否则等待授权,即写者取消授权后,新来的读者不能申请缓冲区。n增加Amutex互斥信号量,保护waitAuthCount、authFlagn增加同步信号量mutexAuth,表示等待授权的读者队列【伪代码如下】semaphoreWmutex=1,Rmutex=1,Amutex=1,mutexAuth=0;intRcount=0;intwaitAuthCount=0;intauthFlag=1;..voidreader()/*读者进程*/{P(Amutex)//临界资源authFlag和wai

6、tAuthCount互斥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

7、);......;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<

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。