⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reader_first.cpp

📁 这是一个操作系统中的读者优先算法的实现绝对正确
💻 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 + -