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

📄 duzhe-xiezhe.cpp

📁 操作系统实验
💻 CPP
字号:
#include <windows.h>
#include <conio.h> 
#include "fstream.h" 
#include <stdio.h>


int read_count=0;          //记录读者数目,开始为0
int write_count=0;         //记录写者数目,开始为0

CRITICAL_SECTION RP_Write; //临界资源区
CRITICAL_SECTION cs_Write;
CRITICAL_SECTION cs_Read;
struct ProcessInfo               //线程信息
{	int Process_serial_number;              //线程序号
	double Process_Delay;       //线程读/写持续时间
	double Process_Start;     //线程开始时间
	char ProcessClass;           //判断线程是读者还是写者(即线程类别)
};
void R_Fun(char* file);//读者优先函数	
void R_ReaderProcess(void *p);//处理读者优先读者线程
void R_WriterProcess(void *p);//处理读者优先写者线程
void W_Fun(char* file);  //写者优先函数
void W_ReaderProcess(void *p);//处理写者优先读者线程
void W_WriterProcess(void *p);//处理写者优先写者线程
int main()   //进程主函数
{
	char select;
	while (true)
	{
		printf("★★★★★★★★★★★★验证实现读者-写者问题★★★★★★★★★★★★\n");
		printf("\n");
		printf("               a:执行读者优先\n");
		printf("\n");
		printf("               b:执行写者优先\n");
		printf("\n");
		printf("               c:关闭本窗口\n");
		printf("\n");
        printf("  根据提示选择要进行的操作:");

    	do
		{
			cin>>select;
			if(select!='a' && select!='b' && select!='c')
				printf("\n 输入错误,务必选择a/b/c中的一个字母!");

		}while (select!='a' && select!='b' && select!='c');
		system("cls");
		if (select=='c')
			return 0;//关闭本窗口
		else if (select=='a')    //运行读者优先函数
				R_Fun("yanzheng.txt");
			 else if(select=='b')    //运行写者优先函数
			    W_Fun("yanzheng.txt");
			 printf("\n  是否还要继续?   1. 继续(返回主窗口)   2.退出(关闭该程序)");

		do
		{
			cin>>select;
			if(select!='1' && select!='2' )
				printf("\n 输入错误,务必输入1/2中的一项!");

		}while (select!='1' && select!='2');
		if(select=='2')
			return 0;//	退出(关闭程序)
		system("cls");
	}
	return 0;
}

//以下为读者优先函数
void R_Fun(char* file)
{
	DWORD Process_ID;         //线程ID
	DWORD waiting_for_all_process;      //等待所有线程结束
	DWORD Processnumber=0;        //定义线程数初值为0    
	//临界资源
	HANDLE h_Mutex;        
	//互斥对象(h_Mutex)确保线程拥有对单个资源的互斥访问权
	h_Mutex=CreateMutex(NULL,FALSE,"mutex_for_read_count");
	HANDLE h_process[64];	//线程对象数组,最大64
	ProcessInfo process_info[64];
	read_count=0;     
	InitializeCriticalSection(&RP_Write);  //初始化临界区
	ifstream inFile;
	inFile.open(file); 
	printf("       读者优先  运行过程:\n");
    printf("\n");
	while (inFile)
	{//读入每一个读者/写者的信息
	inFile>>process_info[Processnumber].Process_serial_number
    >>process_info[Processnumber].ProcessClass
	>>process_info[Processnumber].Process_Start
    >>process_info[Processnumber].Process_Delay;
		if (-1 == inFile.get())
			break;
		Processnumber++;//线程数自加
	}
	for (int i=0;i<(int)(Processnumber);i++)
	{
		if (process_info[i].ProcessClass=='r')   //创建读者线程
			
			h_process[i]=CreateThread(NULL,0,\
			(LPTHREAD_START_ROUTINE)(R_ReaderProcess),\
			&process_info[i],0,&Process_ID);
		else                                    //创建写者线程
			
			h_process[i]=CreateThread(NULL,0,\
			(LPTHREAD_START_ROUTINE)(R_WriterProcess),\
			&process_info[i],0,&Process_ID);
	}
	waiting_for_all_process=WaitForMultipleObjects(Processnumber,h_process,TRUE,-1);
	printf("\n");
    printf("  已完成所有读者和写者线程操作,请根据提示继续操作 \n");

}
//以下为读者优先--读者线程
void R_ReaderProcess(void *p)
{
	//互斥变量
	HANDLE h_Mutex;
	h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_read_count");
	DWORD m_delay_time;          //延迟时间
	DWORD m_Process__Delay;        //读操作持续时间
	DWORD waiting_for_mutex;   //等待互斥变量所有权
	int m_Process_serial_number;           //线程序号
	m_Process_serial_number=((ProcessInfo *)(p))->Process_serial_number;
	m_delay_time=(DWORD)(((ProcessInfo *)(p))->Process_Start*100);
	m_Process__Delay=(DWORD)(((ProcessInfo *)(p))->Process_Delay*100);
	Sleep(m_delay_time);                                   //延迟等待
	printf("读者 %d  发出读请求.\n",m_Process_serial_number);

//等待互斥对象通知
	waiting_for_mutex=WaitForSingleObject(h_Mutex,-1);   //等待互斥信号,保证对read_count的访问、
													  //修改互斥
	read_count++;                                      //读者数目加一
	if (read_count==1)
		EnterCriticalSection(&RP_Write);//禁止写者进入	          
	ReleaseMutex(h_Mutex);//释放互斥对象,允许下个读者继续读:
	//读操作
	printf("读者 %d  开始读操作.\n",m_Process_serial_number);

	Sleep(m_Process__Delay);
	//退出线程
	printf("读者 %d  完成读操作.\n",m_Process_serial_number);
	
	waiting_for_mutex=WaitForSingleObject(h_Mutex,-1);  //等待互斥信号,保证对read_count的访问、修改互斥
	read_count--;                                     //读者数目减少
	if (read_count==0)
		LeaveCriticalSection(&RP_Write);	         //如果所有读者读完,唤醒写者
	ReleaseMutex(h_Mutex);//释放互斥信号
}
//以下为读者优先--写者线程
void R_WriterProcess(void *p)
{
	int m_Process_serial_number;        //线程序号
	DWORD m_delay_time;          //延迟时间
	DWORD m_Process__Delay;  //读操作持续时间
	
	//从参数中获得信息
	m_Process_serial_number=((ProcessInfo *)(p))->Process_serial_number;
	m_delay_time=(DWORD)(((ProcessInfo *)(p))->Process_Start*100);
	m_Process__Delay=(DWORD)(((ProcessInfo *)(p))->Process_Delay*100);
	Sleep(m_delay_time);                                   //延迟等待
	printf("写者 %d  发出写请求.\n",m_Process_serial_number);

	EnterCriticalSection(&RP_Write);//禁止下一位写者进入
	//写操作
	printf("写者 %d  开始写操作.\n",m_Process_serial_number);

	Sleep(m_Process__Delay);
	//退出线程
    printf("写者 %d  完成写操作.\n",m_Process_serial_number);
	LeaveCriticalSection(&RP_Write);	//如果所有读者读完,唤醒写者
}
//以下为写者优先处理函数
void W_Fun(char* file)
{
	DWORD Process_ID;         //线程ID
	DWORD Processnumber=0;        //线程数目
	DWORD waiting_for_all_process;      //等待所有线程结束
	//互斥对象
	HANDLE h_Mutex1, h_Mutex2, h_Mutex3;
	h_Mutex1 = CreateMutex(NULL, FALSE, "mutex_for_write_count");
	h_Mutex2 = CreateMutex(NULL, FALSE, "mutex_for_read_count");
	h_Mutex3 = CreateMutex(NULL, FALSE, "mutex_for_read");
	//线程对象数组
	HANDLE h_process[64];
	ProcessInfo process_info[64];
	read_count=0;     //初始化read_count
	InitializeCriticalSection(&cs_Write);  //初始化临界区
	InitializeCriticalSection(&cs_Read);
	ifstream inFile;
	inFile.open(file);                     //打开操作
	printf("       写者优先  运行过程:\n");
    printf("\n");
	while (inFile)
	{//读入每一个读者、写者的信息		
		inFile>>process_info[Processnumber].Process_serial_number
    >>process_info[Processnumber].ProcessClass
	>>process_info[Processnumber].Process_Start
    >>process_info[Processnumber].Process_Delay;
	if(-1 == inFile.get())
			break;
		Processnumber++;//线程数自加
	}
	for (int i=0;i<(int)(Processnumber);i++)
	{
		if (process_info[i].ProcessClass=='r')
			//创建读者线程
			h_process[i]=CreateThread(NULL,0,\
			(LPTHREAD_START_ROUTINE)(W_ReaderProcess),\
			&process_info[i],0,&Process_ID);
		else
			//创建写者线程
			h_process[i]=CreateThread(NULL,0,\
			(LPTHREAD_START_ROUTINE)(W_WriterProcess),\
			&process_info[i],0,&Process_ID);
	}
	//等待所有线程结束
	waiting_for_all_process=WaitForMultipleObjects(Processnumber,h_process,TRUE,-1);
	printf("\n");
    printf("  已完成所有读者和写者线程操作,根据提示继续操作!");

}
//以下为写者优先--写者线程
void W_WriterProcess(void *p)
{
	//互斥变量
	HANDLE h_Mutex1;
	h_Mutex1 = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_write_count");
	int m_Process_serial_number;           //线程序号
	DWORD m_delay_time;          //延迟时间
	DWORD m_Process__Delay;        //读操作持时续间
	DWORD waiting_for_mutex;   //等待互斥变量所有权
	m_Process_serial_number=((ProcessInfo *)(p))->Process_serial_number;
	m_delay_time=(DWORD)(((ProcessInfo *)(p))->Process_Start*100);//每秒时钟中断100次
	m_Process__Delay=(DWORD)(((ProcessInfo *)(p))->Process_Delay*100);	Sleep(m_delay_time);   
	printf("写者 %d  发出写请求.\n",m_Process_serial_number);

	waiting_for_mutex=WaitForSingleObject(h_Mutex1,-1);  
	write_count++;
	if (write_count==1)
		EnterCriticalSection(&cs_Read);
	ReleaseMutex(h_Mutex1);
	EnterCriticalSection(&cs_Write);
	printf("写者 %d  开始写操作.\n",m_Process_serial_number);

	Sleep(m_Process__Delay);
    printf("写者 %d  完成写操作.\n",m_Process_serial_number);
	LeaveCriticalSection(&cs_Write);
	waiting_for_mutex=WaitForSingleObject(h_Mutex1,-1);  
	write_count--;
	if(write_count == 0)
		LeaveCriticalSection(&cs_Read);
	ReleaseMutex(h_Mutex1);
}
//以下为写者优先--读者线程
void W_ReaderProcess(void *p)
{
	HANDLE h_Mutex2, h_Mutex3;
	h_Mutex2 = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_read_count");
	h_Mutex3 = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_read");
	DWORD waiting_for_mutex, waiting_for_mutex1; 
//等待互斥变量所有权
	DWORD m_delay_time;          //延迟时间
	DWORD m_Process__Delay;        //读操作持续时间
	int m_Process_serial_number;           //线程序号
	m_Process_serial_number=((ProcessInfo *)(p))->Process_serial_number;
	m_delay_time=(DWORD)(((ProcessInfo *)(p))->Process_Start*100);
	m_Process__Delay=(DWORD)(((ProcessInfo *)(p))->Process_Delay*100);
	Sleep(m_delay_time);
    printf("读者 %d  发出读请求.\n",m_Process_serial_number);
	waiting_for_mutex1=WaitForSingleObject(h_Mutex3,-1);
	EnterCriticalSection(&cs_Read);
	LeaveCriticalSection(&cs_Read);
	ReleaseMutex(h_Mutex3);
	waiting_for_mutex=WaitForSingleObject(h_Mutex2,-1); 
	read_count++;
	if (read_count == 1)
		EnterCriticalSection(&cs_Write);
	ReleaseMutex(h_Mutex2);
    printf("读者 %d  开始读操作.\n",m_Process_serial_number);

	Sleep(m_Process__Delay);

    printf("读者 %d  完成读操作.\n",m_Process_serial_number);
	waiting_for_mutex=WaitForSingleObject(h_Mutex2,-1);
	read_count--;
	if (read_count == 0)
		LeaveCriticalSection(&cs_Write);
	ReleaseMutex(h_Mutex2);
} //结束

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -