读者写者问题写者优先参考答案Word格式.docx
- 文档编号:17421088
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:7
- 大小:16.29KB
读者写者问题写者优先参考答案Word格式.docx
《读者写者问题写者优先参考答案Word格式.docx》由会员分享,可在线阅读,更多相关《读者写者问题写者优先参考答案Word格式.docx(7页珍藏版)》请在冰豆网上搜索。
可,为此我们引入一个互斥信号量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;
/*执行读操作*/
Rcount=Rcount-1;
if(Rcount==0)V(wmutex);
}
}
voidwriter()/*写者进程*/
P(Wmutex);
write;
/*执行写操作*/
现在回到【写者优先】优先问题
【解题思路】在上面的读者写者问题基础上,做以下修改:
增加授权标志authFlag,当写者到来,发现有读者在读,则取消授权,然后等待缓冲区;
增加“等待授权计数器waitAuthCount”,写者离开时,如果waitAuthCount大于0,则迭代唤醒等待授权的读者;
读者到来,首先看授权标志,如果有授权标志,则继续,否则等待授权,即写者取消授权后,新来的读者不能申请缓冲区。
增加Amutex互斥信号量,保护waitAuthCount、authFlag
增加同步信号量mutexAuth,表示等待授权的读者队列
【伪代码如下】
semaphoreWmutex=1,Rmutex=1,Amutex=1,mutexAuth=0;
intwaitAuthCount=0;
intauthFlag=1;
P(Amutex)//临界资源authFlag和waitAuthCount互斥
if(authFlag==0)
{
waitAuthCount++;
p(mutexAuth);
}
V(Amutex)
P(Rmutex);
//临界资源Rcount互斥
//缓冲区互斥
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]计算机操作系统-郁红英-冯庚豹-人民邮电出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 读者 问题 优先 参考答案