📄 banker.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 + -