📄 reader_first.cpp
字号:
//读者优先算法实现
#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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -