📄 res.h
字号:
//把需求队列放入需求矩阵,并且把已分配队列置空后放入已分配矩阵void add_thread_res( vector<int>& needed){ //将已经分配的部分置为空 g_already.push_back(empty); g_needed.push_back(needed);}//测试进程是否能够执行,即当前状态是否安全int allow(){ vector<int> work(g_free);//能够支持运行的资源 vector<int> finish;//每个线程是否能够结束的标志,如果可以结束,则该线程的所有资源都是可以支持运行的 for (unsigned int i=0; i < g_already.size(); i++) finish.push_back(0); int fin = 1;//是否有线程可以结束的标志 while (fin) { fin = 0; int i = 0; list< vector<int> >::iterator g_needed_tmp_ptr = g_needed.begin(); list< vector<int> >::iterator g_already_tmp_ptr = g_already.begin(); for (;g_needed_tmp_ptr != g_needed.end(); g_needed_tmp_ptr++, g_already_tmp_ptr++, i++) { if (finish[i] != 1)//如果该线程还没有结束,判断是否可以结束 { //debug //cout << i << "没有结束" << endl; //debug int small = 1; for (int j=0; j < g_res_size; j++) { //debug //cout << j << "\t" << (*g_needed_tmp_ptr)[j] << "\t" << work[j] << endl; //debug if ( (*g_needed_tmp_ptr)[j] > work[j] ) { small = 0; break; } } if (small)//如果可以结束 { //debug //cout << i << "可以结束" << endl; //debug fin = 1;//需要重新进行循环 finish[i] = 1;//置可以结束标志为1 //把已经分配的资源添加到可以执行运行的资源中去 for (int j=0; j<g_res_size; j++) { work[j] += (*g_already_tmp_ptr)[j]; } } } } } for (unsigned int i=0; i < g_already.size(); i++) { if (finish[i] != 1) return 0; } return 1;}//当前线程申请资源int request_res(int res_id){ if (res_id >= g_res_size) return -1; (*g_already_ptr)[res_id]++; (*g_needed_ptr)[res_id]--; g_allot[res_id]++; g_free[res_id]--; if (allow()) return 1; (*g_already_ptr)[res_id]--; (*g_needed_ptr)[res_id]++; g_allot[res_id]--; g_free[res_id]++; return 0;}//释放当前线程中的资源int free_res(int res_id){ if (res_id < g_res_size) { (*g_already_ptr)[res_id]--; g_allot[res_id]--; g_free[res_id]++; return 1; } return 0;}//释放当前线程的所有资源void free_all_res(){ for (int i=0; i < g_res_size; i++) { *(g_allot.begin()+i) -= (*g_already_ptr)[i]; *(g_free.begin()+i) += (*g_already_ptr)[i]; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -