- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
读者-写者问题解答
2.读者—写者问题
读者—写者问题(Readers-Writers problem)也是一个经典的并发程序设计问题,是经常出现的一种同步问题。计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者Reader);另一些进程则要求修改数据(称为写者Writer)。就共享数据而言,Reader和Writer是两组并发进程共享一组数据区,要求:
(1)允许多个读者同时执行读操作;
(2)不允许读者、写者同时操作;
(3)不允许多个写者同时操作。
Reader和Writer的同步问题分为读者优先、弱写者优先(公平竞争)和强写者优先三种情况,它们的处理方式不同。
(1)读者优先。对于读者优先,应满足下列条件:
如果新读者到:
①无读者、写者,新读者可以读;
②有写者等待,但有其它读者正在读,则新读者也可以读;
③有写者写,新读者等待。
如果新写者到:
①无读者,新写者可以写;
②有读者,新写者等待;
③有其它写者,新写者等待。
单纯使用信号量不能解决读者与写者问题,必须引入计数器rc 对读进程计数;rc_mutex 是用于对计数器rc 操作的互斥信号量;write表示是否允许写的信号量;于是读者优先的程序设计如下:
int rc=0; //用于记录当前的读者数量
semaphore rc_mutex=1; //用于对共享变量rc 操作的互斥信号量
semaphore write=1; //用于保证读者和写者互斥地访问的信号量
void reader() /*读者进程*/
do{
P(rc_mutex); //开始对互斥访问 rc ++; //来了一个读进程,读进程数if (rc==1) P(write); //如是第一个进程判断是否有进程在临界有等待,进程
V(rc_mutex); //结束对的互斥访问 读文件;
P(rc_mutex); //开始对的互斥访问 rc--; //一个读进程数if (rc == 0) V(write); //最后一个离开临界区的进程需要进程进临界区
V(rc_mutex); //结束对的互斥访问} while(1)
void writer() /*写者进程*/
do{
P(write); //无读进程,进入写进程;若有读进程,写进程等待
写文件;
V(write); //写进程完成;判断是否有读进程需要进入临界区,
//若有,唤醒一个读进程进临界区
} while(1)
读者优先的设计思想是读进程只要看到有其它读进程正在读,就可以继续进行读;写进程必须等待所有读进程都不读时才能写,即使写进程可能比一些读进程更早提出申请。该算法只要还有一个读者在活动,就允许后续的读者进来策略的结果是,如果有一个稳定的读者流存在,那么这些读者将在到达后被允许进入。而写者就始终被挂起,直到没有读者为止。在一个写者到达时如果有正在工作的读者,那么该写者只要等待正在工作的读者完成,而不必等候其后面到来的读者。一个写者在等待时,读者在写者之后被挂起,而不是立即允许进入。int rc=0; //用于记录当前的读者数量
semaphore rc_mutex=1; //用于对共享变量rc 操作的互斥信号量
semaphore wc_mutex=1; //用于保证读者和写者互斥地访问的信号量
semaphore write=1; //用于保证读者和写者互斥地访问的信号量
semaphore read=1; //用于保证在写进程封锁其后续的读进程的信号量
void reader() /*读者进程*/
do{
P(read); //若有写进程,后续读进程等待,在read队列上排队
P(rc_mutex); //开始对互斥访问c++; //来了一个读进程,读进程数
if rc=1 then P(write); //第一个进程需要判断是否有进程在临界区,有需要等待,没有进程V(rc_mutex); //结束对的互斥访问V(read); //从 read队列中唤醒一个进程
Reading the file
您可能关注的文档
最近下载
- 学校--以老带新”实施方案.docx VIP
- 2022《贯彻执行中央八项规定、推进作风建设综述》专题PPT.ppt VIP
- -IATF 16949质量管理体系培训 .ppt VIP
- 医美整形线上平台留客升单策略.docx VIP
- 高中物理力学——动态平衡问题处理方法.pdf VIP
- 一种可实时监控的负压引流系统及其使用方法.pdf VIP
- 2022年新版《义务教育体育与健康课程标准》考试学习资料.docx VIP
- 2024-2025学年天津市南开区七年级(下)期末数学试卷.pdf VIP
- IATF16949质量管理体系模板或IATF16949质量管理手册.docx VIP
- 外研版八年级上册 Unit 1 单元测试卷答案及解析 新版 2025年新外研版八年级上册.docx
文档评论(0)