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

📄 banker.cpp

📁 操作系统中的经典问题:银行家算法
💻 CPP
字号:
//#define _DEBUG#include "file.h"//执行某条指令void exec(char instruction){	cout << instruction;}//程序开始执行void run(){	int instruction;//指令,其中#为申请资源指令,*为释放资源指令	int res_id;//资源的ID	list< list<int> >::iterator thread_ptr;//当前执行的进程指针	list< string >::iterator thread_name_ptr;//进程名称指针	int counter = 0;	g_already_ptr = g_already.begin();	g_needed_ptr = g_needed.begin();	thread_ptr = g_thread.begin();	thread_name_ptr = g_thread_name.begin();	while (g_thread.size())	{		int out = 0;		cout << endl << *thread_name_ptr << " is runing" << endl;		for (int i=0; i < MAX_INSTRUCTION && (*thread_ptr).size()>1; i++)		{    		instruction = (*thread_ptr).front();//读取指令    		(*thread_ptr).pop_front();    		if (instruction == '#')    		{#ifdef _DEBUGhow_res();cout << *thread_name_ptr << " request resource " << res_id << endl;#endif    			res_id = (*thread_ptr).front();    			(*thread_ptr).pop_front();    			int result = request_res(res_id);    			if (result == -1)    			{    				cout << endl << *thread_name_ptr << " REQUEST resource " << res_id << " which is a error resource, it will be end!" << endl;    				free_all_res();    				if (g_thread.size() == 1)					{						g_already.erase(g_already_ptr);						g_needed.erase(g_needed_ptr);						g_thread.erase(thread_ptr);						g_thread_name.erase(thread_name_ptr);					}					else					{						if (counter == (int)g_thread.size() -1)						{							g_already_ptr = g_already.begin();							g_needed_ptr = g_needed.begin();							thread_ptr = g_thread.begin();							thread_name_ptr = g_thread_name.begin();							counter = 0;							g_already.pop_back();							g_needed.pop_back();							g_thread.pop_back();							g_thread_name.pop_back();						}						else						{							list< vector<int> >::iterator templv;							list<string>::iterator templs;							list< list<int> >::iterator templl;							templv = g_already_ptr++;							g_already.erase(templv);							templv = g_needed_ptr++;							g_needed.erase(templv);							templl = thread_ptr++;							g_thread.erase(templl);							templs = thread_name_ptr++;							g_thread_name.erase(templs);						}					}					out = 1;    				break;    			}     			else if (result == 0)    			{    				cout << endl << *thread_name_ptr << " REQUEST resource " << g_res[res_id] << " failed, it will try the next time!" << endl;    				(*thread_ptr).push_front(res_id);    				(*thread_ptr).push_front('#');    				break;    			}    			else    				cout << endl << *thread_name_ptr << " REQUEST resource " << g_res[res_id] << " succeed!" << endl;    		}    		else if (instruction == '*')    		{    			res_id = (*thread_ptr).front();    			(*thread_ptr).pop_front();				if (free_res(res_id))    				cout << endl << *thread_name_ptr << " RELEASE resource " << g_res[res_id] << " succeed!" << endl;				else				{					cout << endl << *thread_name_ptr << " RELEASE resource " << res_id << " which is a error resource, it will be end!" << endl;    				free_all_res();    				if (g_thread.size() == 1)					{						g_already.erase(g_already_ptr);						g_needed.erase(g_needed_ptr);						g_thread.erase(thread_ptr);						g_thread_name.erase(thread_name_ptr);					}					else					{						if (counter == (int)g_thread.size() -1)						{							g_already_ptr = g_already.begin();							g_needed_ptr = g_needed.begin();							thread_ptr = g_thread.begin();							thread_name_ptr = g_thread_name.begin();							counter = 0;							g_already.pop_back();							g_needed.pop_back();							g_thread.pop_back();							g_thread_name.pop_back();						}						else						{							list< vector<int> >::iterator templv;							list<string>::iterator templs;							list< list<int> >::iterator templl;							templv = g_already_ptr++;							g_already.erase(templv);							templv = g_needed_ptr++;							g_needed.erase(templv);							templl = thread_ptr++;							g_thread.erase(templl);							templs = thread_name_ptr++;							g_thread_name.erase(templs);						}					}					out = 1;    				break;				}    		}    		else    			exec( (char)instruction );    	}    	if (out)    		continue;		//如果线程执行完毕,清理资源		else if ((*thread_ptr).size()<=1)		{			cout << endl << *thread_name_ptr << " finished, it will release all the resources!" << endl;			free_all_res();			if (g_thread.size() == 1)			{				g_already.erase(g_already_ptr);				g_needed.erase(g_needed_ptr);				g_thread.erase(thread_ptr);				g_thread_name.erase(thread_name_ptr);			}			else			{				if (counter == (int)g_thread.size() -1)				{					g_already_ptr = g_already.begin();					g_needed_ptr = g_needed.begin();					thread_ptr = g_thread.begin();					thread_name_ptr = g_thread_name.begin();					counter = 0;					g_already.pop_back();					g_needed.pop_back();					g_thread.pop_back();					g_thread_name.pop_back();				}				else				{					list< vector<int> >::iterator templv;					list<string>::iterator templs;					list< list<int> >::iterator templl;					templv = g_already_ptr++;					g_already.erase(templv);					templv = g_needed_ptr++;					g_needed.erase(templv);					templl = thread_ptr++;					g_thread.erase(templl);					templs = thread_name_ptr++;					g_thread_name.erase(templs);				}			}		}		else if (counter == (int)g_thread.size() -1)		{			g_already_ptr = g_already.begin();			g_needed_ptr = g_needed.begin();			thread_ptr = g_thread.begin();			thread_name_ptr = g_thread_name.begin();			counter = 0;		}		else		{			g_already_ptr++;			g_needed_ptr++;			thread_ptr++;			thread_name_ptr++;			counter++;		}	}}main(int argc,char *argv[]){	init();	what_are_res();	cout << "Computer init over,now it is going to run!" << endl << endl;	if (argc < 2)	{		cout << "no thread is going to run ,the computer will shut down!";		exit(2);	}	for (int i = 1; i < argc; i++)	{		add_thread(*(argv+i));	}	how_res();	//此处加入测试代码,测试文件内容是否正确	#ifdef _DEBUG	list< list<int> >::iterator thread_test_ptr = g_thread.begin();	for (; thread_test_ptr != g_thread.end(); thread_test_ptr++)	{		list<int>::iterator thread_text_test_ptr = (*thread_test_ptr).begin();		for (; thread_text_test_ptr != (*thread_test_ptr).end(); thread_text_test_ptr++)		{			cout << (char)*thread_text_test_ptr;		}		cout << endl;	}	#endif	if (allow())	{		run();	}	else	{		cout << "The System now is not in safe, maybe some thread request too much resources, the computer will shut down!";	}}

⌨️ 快捷键说明

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