针对进程快照的死锁检测算法

输入格式:

进程数量

进程id 持有的锁id 等待的锁id

进程id 持有的锁id 等待的锁id


其中,每个进程可持有0个或多个锁,等待0个或1个锁;

检测进程情况是否存在死锁,若存在则输出死锁个数。

输入样例如下:

7

123 1001,1002 1003
127 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;

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值