输入格式:
进程数量
进程id 持有的锁id 等待的锁id
进程id 持有的锁id 等待的锁id
其中,每个进程可持有0个或多个锁,等待0个或1个锁;
检测进程情况是否存在死锁,若存在则输出死锁个数。
输入样例如下:
7
123 1001,1002 1003127 1100
128 1010
129
124 1007 1008
125 1003 1004
126 1004 1002
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
struct entity{
int id;
vector<int> holdlocks;
int waitlock;
};
vector<string> split(string s,string sep){
vector<string> v;
string temp;
do{
int pos = s.find(sep);
if(pos == -1){
v.push_back(s);
return v;
}
temp = s.substr(0,pos);
s.erase(0,pos+1);
v.push_back(temp);
}while(true);
return v;
}
int main()
{
int n ;
cin>>n;
getchar();
vector<entity> vec ;
//读入数据
while(n--){
string s;
entity en;
getline(cin,s);
vector<string> arr = split(s,"\t");
if(arr.size()!=3)
continue;
en.id = atoi(arr[0].c_str());
vector<int> holdlocks;
if(arr[1]!=" "){
vector<string> locks = split(arr[1],",");
for(size_t i = 0;i<locks.size();i++){
holdlocks.push_back(atoi(locks[i].c_str()));
}
}
en.holdlocks = holdlocks;
int waitlock = -1;
if(arr[2]!=" "){
waitlock = atoi(arr[2].c_str());
}
en.waitlock = waitlock;
vec.push_back(en);
}
//检测锁
int locknum= 0;
set<int> hasInCircle;
for(size_t i =0;i<vec.size();i++){
entity cur = vec[i];
int waitlock = cur.waitlock;
if(hasInCircle.find(cur.id) != hasInCircle.end()||waitlock == -1)
continue;
set<int> circle;
bool finddeadlock = false;
while(waitlock != -1){
bool find = false;
for(size_t j = 0;j<vec.size();j++){
entity en = vec[j];
vector<int> holdlocks = en.holdlocks;
for(int l = 0;l<holdlocks.size();l++){
if(holdlocks[l] == waitlock){
waitlock = en.waitlock;
find = true;
if(circle.find(en.id)!= circle.end())
{
locknum++;
finddeadlock = true;
}else{
circle.insert(en.id);
}
break;
}
}
if(find || finddeadlock)
break;
}
if(!find || finddeadlock)
break;
}
if(finddeadlock && circle.size()>0){
hasInCircle.insert(circle.begin(),circle.end());
}
}
cout<<locknum<<endl;
}