📄 writer_first.cpp
字号:
//写者优先算法实现
#include <windows.h>
#include <iostream.h>
#include <fstream.h>
#define MAX_PERSON 200 //最大规定的线程人数为200人
#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; //创建Mutex信号量
HANDLE w;//创建w信号量
HANDLE s;//创建s信号量
DWORD WINAPI Reader(LPVOID lpParam) //读者互斥的实现
{
Person *pPerson = (Person*)lpParam;
while(currentTime != pPerson->StartTime) { }
cout<<"CurrentTime = "<<currentTime<<" :Reader "<<pPerson->ID<<" is Requesting"<<endl;
WaitForSingleObject(s,INFINITE);//相当于P(s)操作
WaitForSingleObject(Mutex,INFINITE); //相当于P(Mutex)操作
readCount++;
if(readCount == 1)
WaitForSingleObject(w,INFINITE);//相当于P(w)操作
ReleaseSemaphore(Mutex,1,NULL); //相当于V(Mutex)操作
ReleaseSemaphore(s,1,NULL); //相当于V(s)操作
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;
// wait for the start time
while(currentTime != pPerson->StartTime) { }
cout<<"CurrentTime = "<<currentTime<<" :Writer "<<pPerson->ID<<" is Requesting"<<endl;
WaitForSingleObject(s,INFINITE);//相当于P(s)操作
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)操作
ReleaseSemaphore(s,1,NULL);//相当于V(s)操作
numExit++;
ExitThread(0);//结束线程
return 0;
}
void CreateReaderWriter()//创建读者、写者进程
{
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,Reader,(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,MAX_PERSON,NULL);//创建Mutex信号量
w=CreateSemaphore(NULL,1,MAX_PERSON,NULL);//创建w信号量
s=CreateSemaphore(NULL,1,MAX_PERSON,NULL);//创建s信号量
CreateReaderWriter(); //调用创建读者、写者进程
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 + -