读者写者问题写者优先参考答案Word格式文档下载.docx

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

读者写者问题写者优先参考答案Word格式文档下载.docx

《读者写者问题写者优先参考答案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《读者写者问题写者优先参考答案Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。

读者写者问题写者优先参考答案Word格式文档下载.docx

{

P(Wmutex);

write;

/*执行写操作*/

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

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

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

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

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

⏹增加授权标志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;

/*执行读操作*/

if(Rcount==0)

V(wmutex);

if(Rcount>

0)

authFlag=0;

P(Wmutex);

write;

P(Amutex)

while(waitAuthCount>

0){

v(mutexAuth);

waitAuthCount--;

 

【vc++代码】

//testsemaphore.cpp:

Definestheentrypointfortheconsoleapplication.

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

//

#include"

stdafx.h"

windows.h"

process.h"

#include<

iostream>

#include<

time.h>

usingnamespacestd;

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

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

HANDLEWmutex,Rmutex,Authmutex,Amutex;

intauthFlag=1;

DWORDWINAPIreader(){

P(Amutex);

cout<

<

"

等待授权,线程ID:

GetCurrentThreadId()<

endl;

P(Authmutex);

V(Amutex);

P(Wmutex);

cout<

读数据,线程ID:

Sleep(500);

/*执行读操作*/

V(Wmutex);

return1;

};

DWORDWINAPIwriter(){

cout<

取消授权,线程ID:

authFlag=0;

写数据,线程ID:

Sleep(2000);

V(Wmutex);

授权读,线程ID:

authFlag=1;

while(waitAuthCount>

V(Authmutex);

waitAuthCount--;

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]计算机操作系统-郁红英-冯庚豹-人民邮电出版社

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

当前位置:首页 > 高等教育 > 教育学

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

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