标签:中间 总线 结束 记录 简单 过程 lock 如何 状态
1.给定n个线程,n个锁,和一组线程对锁的操作,判断是否会发生死锁。
例如:
T L S
1 1 1
2 2 1
1 2 1
2 1 1
这个例子的含义是:1号线程对1号锁加锁成功(S=1代表加锁,S=0代表解锁),2号线程对2号锁加锁成功,然后1号线程试图获取2号锁,保持等待,2号线程试图获取1号锁,保持等待,产生死锁。现在给定这样的一组T、L、S数据,判断是否产生死锁。
该问题的关键是如何判断发生死锁:即整个流程结束有任意多的线程处于等待或在中间过程中全部线程处于等待.
因此判断的流程很简单:使用set<int> lock记录每个锁的状态,使用map<int, int> threads,记录当前等待的线程及等待位置。在一个线程试图获取锁的时候,如果lock中没有这个锁,那么线程获取锁成功,线程也不会等待。如果lock已经有这个锁了,那么当前线程加入threads中,意思是当前线程处于等待状态,并且记录执行到第几步,在此之后T为当前线程的所有后续操作都不能继续执行,如果发现有线程释放了锁,那么就遍历threads,看看哪些线程能继续往下走依次类推.如果threads中的线程总数等于总线程数,那么意味着当前发生死锁,或者最后threads的size仍然不为0,那么意味着仍有线程处于等待,那么也产生死锁.
标签:中间 总线 结束 记录 简单 过程 lock 如何 状态
原文地址:https://www.cnblogs.com/deepllz/p/11490154.html