[c++]代码库
#include<stdio.h>
#include<iostream.h>
#include<string.h>
const int MAXQUEUE = 100; //定义表的最大行数
typedef struct node {
int resource;
int process;
} cell;
cell occupy[MAXQUEUE];
int occupy_quantity;
cell wait[MAXQUEUE];
int wait_quantity;
//初始化函数
void initial() {
int i;
for(i = 0; i < MAXQUEUE; i++) {
occupy[i].process = -1;
occupy[i].resource = -1;
wait[i].process = -1;
wait[i].resource = -1;
}
occupy_quantity = 0;
wait_quantity = 0;
}
//读数据文件
int readData() {
FILE *fp;
char fname[20];
int i;
cout << "请输入资源分配表文件的文件名:" << endl;
strcpy(fname, "10trouble1.txt");
//cin>>fname;
if((fp = fopen(fname, "r")) == NULL) {
cout << "错误,文件打不开,请检查文件名:)" << endl;
return 0;
} else {
while(!feof(fp)) {
fscanf(fp, "%d %d", &occupy[occupy_quantity].resource, &occupy[occupy_quantity].process);
occupy_quantity++;
}
}
cout << "请输入进程等待表文件的文件名:" << endl;
strcpy(fname, "10trouble2.txt");
//cin>>fname;
if((fp = fopen(fname, "r")) == NULL) {
cout << "错误,文件打不开,请检查文件名:)" << endl;
return 0;
} else {
while(!feof(fp)) {
fscanf(fp, "%d %d", &wait[wait_quantity].process, &wait[wait_quantity].resource);
wait_quantity++;
}
}
//输出所读入的数据
cout << endl << endl << "输出所读入的数据" << endl;
cout << "━━━━━━━━━━━━━━━━━━━━━━━" << endl;
cout << "资源分配表" << endl;
cout << "资源编号 进程编号" << endl;
for(i = 0; i < occupy_quantity; i++) {
cout << " " << occupy[i].resource << " " << occupy[i].process << endl;
}
cout << "───────────────────────" << endl;
cout << "进程等待表" << endl;
cout << "进程编号 资源编号" << endl;
for(i = 0; i < wait_quantity; i++) {
cout << " " << wait[i].resource << " " << wait[i].process << endl;
}
return 1;
}
//检测
void check() {
int table[MAXQUEUE][MAXQUEUE];
int table1[MAXQUEUE][MAXQUEUE];
int i, j, k;
int flag, t, p;
int max_process;
//初始化表格
for(i = 0; i < MAXQUEUE; i++) {
for(j = 0; j < MAXQUEUE; j++) {
table[i][j] = 0;
table1[i][j] = 0;
}
}
//先找到进程最大编号
max_process = -1;
for(i = 0; i < occupy_quantity; i++) {
if(occupy[i].process > max_process) {
max_process = occupy[i].process;
}
}
for(i = 0; i < wait_quantity; i++) {
if(wait[i].process > max_process) {
max_process = wait[i].process;
}
}
for(i = 0; i < wait_quantity; i++) {
for(j = 0; j < occupy_quantity; j++) {
if(wait[i].resource == occupy[j].resource) {
table[wait[i].process][occupy[j].process] = 1;
table1[wait[i].process][occupy[j].process] = 1;
}
}
}
cout << "初始等待占用表:" << endl;
for(i = 0; i < max_process + 1; i++) {
for(j = 0; j < max_process + 1; j++) {
cout << table[i][j] << " ";
}
cout << endl;
}
cout << endl;
for(i = 0; i < max_process + 1; i++) {
for(j = 0; j < max_process + 1; j++) {
for(k = 0; k < max_process + 1; k++) {
table[i][j] = table[i][j] || (table[i][k] && table[k][j]);
}
}
}
cout << "检测后的等待占用表:" << endl;
for(i = 0; i < max_process + 1; i++) {
for(j = 0; j < max_process + 1; j++) {
cout << table[i][j] << " ";
}
cout << endl;
}
flag = -1;
for(i = 0; i < max_process + 1; i++) {
if(table[i][i] == 1) {
flag = i;
break;
}
}
cout << endl << endl << "检测结果" << endl;
cout << "───────────────────" << endl;
if(flag != -1) {
cout << "存在死锁" << endl;
cout << "进程循环等待队列:";
p = flag; //存在进程循环等待队列的那一进程
//进程循环等待队列中的所有进程是table表中的这一行是1的进程,只是顺序要再确定
t = 1;
while(t) {
cout << p << " ";
for(j = 0; j < max_process + 1; j++) {
if(table1[p][j] == 1) {
if(table[j][flag] == 1) {
p = j;
break;
}
}
}
if(p == flag)t = 0;
}
cout << flag << endl;
} else {
cout << "不存在死锁" << endl;
}
}
//显示版权信息函数
void version() {
cout << endl << endl;
cout << " ┏━━━━━━━━━━━━━━━━━━━━━━━┓" << endl;
cout << " ┃ 死 锁 检 测 算 法 ┃" << endl;
cout << " ┠───────────────────────┨" << endl;
cout << " ┃ (c)All Right Reserved Neo ┃" << endl;
cout << " ┃ sony006@163.com ┃" << endl;
cout << " ┃ version 2004 build 1122 ┃" << endl;
cout << " ┗━━━━━━━━━━━━━━━━━━━━━━━┛" << endl;
cout << endl << endl;
}
void main() {
int flag;
version();
initial();
flag = readData();
if(flag)check();
}
初级程序员
by: 云代码会员 发表于:2019-11-04 11:39:18 顶(0) | 踩(0) 回复
编译不出来
回复评论