读者写者问题写者优先参考答案Word格式文档下载.docx
《读者写者问题写者优先参考答案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《读者写者问题写者优先参考答案Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
{
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]计算机操作系统-郁红英-冯庚豹-人民邮电出版社