//读者优先算法实现
#include <windows.h>
#include <iostream.h>
#include <fstream.h>
#define MAX_PERSON 100
#define INPUT "D:\\wrinput.txt"//输入文件流的地址,可适当修改
typedef struct
{
HANDLE hThread;
int ID;
char Type;
int StartTime;
int WorkTime;
}Person;
Person Persons[MAX_PERSON];
int numPerson=0;
int numExit=0;
int currentTime=0;
int readCount=0;
HANDLE Mutex;
HANDLE w;
DWORD WINAPI ReaderProc(LPVOID lpParam)
{
Person *pPerson = (Person*)lpParam;
while(currentTime != pPerson->StartTime) { }
cout<<"CurrentTime = "<<currentTime<<" :Reader "<<pPerson->ID<<" is Requesting"<<endl;
WaitForSingleObject(Mutex,INFINITE);//对应于P(Mutex)操作
readCount++;
if(readCount == 1)
WaitForSingleObject(w,INFINITE);//对应于P(w)操作
ReleaseSemaphore(Mutex,1,NULL);//相对应于V(Mutex)操作
pPerson->StartTime = currentTime;
cout<<"CurrentTime = "<<currentTime<<" :Reader "<<pPerson->ID<<" is Reading"<<endl;
while(currentTime < pPerson->StartTime + pPerson->WorkTime)
{
// 读
}
cout<<"CurrentTime = "<<currentTime<<" :Reader "<<pPerson->ID<<" is Exit"<<endl;
WaitForSingleObject(Mutex,INFINITE);//相对应于P(Mutex)操作
readCount--;
if(readCount == 0)
ReleaseSemaphore(w,1,NULL);//对应于V(w)操作
ReleaseSemaphore(Mutex,1,NULL);//相对应于V(Mutex)操作
numExit++;
ExitThread(0);//结束线程
return 0;
}
DWORD WINAPI WriterProc(LPVOID lpParam)
{
Person *pPerson = (Person*)lpParam;
while(currentTime != pPerson->StartTime) { }
cout<<"CurrentTime = "<<currentTime<<" :Writer "<<pPerson->ID<<" is Requesting"<<endl;
WaitForSingleObject(w,INFINITE);//相对应于P(w)操作
pPerson->StartTime = currentTime;
cout<<"CurrentTime = "<<currentTime<<" :Writer "<<pPerson->ID<<" is Writing"<<endl;
while(currentTime < pPerson->StartTime + pPerson->WorkTime)
{
// 写
}
cout<<"CurrentTime = "<<currentTime<<" :Writer "<<pPerson->ID<<" is Exit"<<endl;
ReleaseSemaphore(w,1,NULL);//相对应于V(w)操作
numExit++;
ExitThread(0);
return 0;
}
void CreateReadersAndWriters()//创建读者、写者线程
{
int i;
DWORD dwThreadID;
Person *pPerson;
ifstream fin(INPUT);//由文件输入
while( fin >> Persons[numPerson].ID >> Persons[numPerson].Type
>> Persons[numPerson].StartTime >> Persons[numPerson].WorkTime )
{
numPerson++;
}
if( numPerson > MAX_PERSON )//如果大于规定的人数,报错
{
cout<<"超过规定人数!"<<endl;
return ;
}
for(i=0; i<numPerson; i++)
{
switch(Persons[i].Type)
{
case 'R': pPerson = &Persons[i];
pPerson->hThread = CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);
if(pPerson->hThread == NULL) cout<<"Reader "<<Persons[i].ID<<" 线程创建失败!"<<endl;
break;
case 'W': pPerson = &Persons[i];
pPerson->hThread = CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThreadID);
if(pPerson->hThread == NULL) cout<<"Writer "<<Persons[i].ID<<" 线程创建失败!"<<endl;
break;
}
}
}
int main()
{
Mutex = CreateSemaphore(NULL,1,100,NULL);//创建Mutex信号量
w = CreateSemaphore(NULL,1,100,NULL);//创建w信号量
CreateReadersAndWriters();//创建读者、写者进程
if(numPerson > MAX_PERSON) return 0; //如果大于规定人数,跳出
else cout<<"读者、写者均已创建 !"<<endl;
while(numExit != numPerson)
{
currentTime++; //改变当前时间
Sleep(500);
}
return 0;
}
操作系统读者优先算法实现
需积分: 10 132 浏览量
2008-12-02
15:57:41
上传
评论
收藏 9KB RAR 举报
py375859871
- 粉丝: 0
- 资源: 2
最新资源
- mysql修改密码.md
- 微信浏览器网页版打开插件 支持 Edge / Chrome / Chromium 内核:Wechat-need-web
- 国家开放大学电大化工制图形考任务答案
- 基于python+sqlite实现知识图谱的农作物病虫害防治智能问答平台
- 移动通信系统ofdm的STO和CFO matlab
- 2024年全国职业院校技能大赛集成电路应用开发赛项竞赛试题(03卷)
- 基于CRT(远程访问终端)+ARM(GEC)+Linux+C语言的视频监控系统源码+文档说明.zip
- 用vue.js开发微信app
- CentOS-7-x86-64-Minimal-2009-迷你版系统镜像
- wireshark抓包软件
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈