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

📄 writer_first.cpp

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