1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| #include <iostream> #include <cstring> using namespace std;
bool isEnough(int i, int a[], int b[]) { cout << i << " : " << a[0] << a[1] << a[2] << a[3] << endl; bool b1 = (a[0] <= b[0]); bool b2 = (a[1] <= b[1]); bool b3 = (a[2] <= b[2]); bool b4 = (a[3] <= b[3]); if (b1 && b2 && b3 && b4) { return true; } return false; }
bool isFinish(bool worker[]) { return (worker[0] && worker[1] && worker[2] && worker[3]); }
int getUnFinish(bool worker[], int loc) { int i = 0; while (!isFinish(worker)) { if ((!worker[i]) && (i != loc)) { return i; } i ++; if (i == 4) { i = 0; } } return -1; }
int* addResource(int *Avliable, int Allocation[]) { int *ans = new int[4]; for (int i = 0; i < 4; i ++) { ans[i] = Avliable[i] + Allocation[i]; } return ans; }
bool safe(int Allocation[][4], int Need[][4], int Avliable[]) { int tmp_avliable[4]; copy(Avliable, Avliable + 4, tmp_avliable); bool worker[4] = {false, false, false, false}; bool judge = false; for (int i = 0; i < 4; i++) { if (isEnough(i, Need[i], Avliable)) { Avliable = addResource(Avliable, Allocation[i]); int count = 0; worker[i] = true; int un_worker = getUnFinish(worker, -1); while (!isFinish(worker)) { if (count > 5) { break; } if (un_worker == -1) { judge = true; break; } if (isEnough(un_worker, Need[un_worker], Avliable)) { Avliable = addResource(Avliable, Allocation[un_worker]); worker[un_worker] = true; un_worker = getUnFinish(worker, -1); } else { un_worker = getUnFinish(worker, un_worker); } count += 1; } } if (isFinish(worker) || judge) { judge = true; break; } copy(tmp_avliable, tmp_avliable + 4, Avliable); memset(worker, false, 4); } if (judge) { cout << "存在安全序列" << endl; return true; } cout << "不存在安全序列,存在死锁情况" << endl; return false; }
int main() { int Allocation[4][4] = {{0, 0, 1, 2}, {1, 0, 0, 0}, {1, 3, 5, 4}, {0, 0, 1, 4}}; int Max[4][4] = {{0, 1, 1, 2}, {1, 7, 5, 0}, {2, 3, 5, 6}, {0, 6, 5, 6}}; int Need[4][4] = {{0, 1, 0, 0}, {0, 7, 5, 0}, {1, 0, 0, 2}, {0, 6, 4, 2}}; int Avliable[4] = {1, 0, 4, 0}; safe(Allocation, Need, Avliable); return 0; }
|