在实时多线程应用程序中检测死锁的方法有哪些?
如果我们发现存在死锁,是否有任何方法可以解决它,而无需关闭/重新启动应用程序?
有两种流行的方法来检测死锁。
一种是让线程设置检查点。例如,如果您有一个具有工作循环的线程,您可以在开始工作时设置一个计时器,该计时器的设置时间比您认为工作可能需要的时间要长。如果计时器触发,您就认为线程处于死锁状态。工作完成后,您取消计时器。
另一个(有时组合使用)是让线程可能阻塞的事情跟踪线程可能持有的其他资源。当其他线程以相反顺序获取这些锁时,这可以直接检测到获取一个锁同时持有另一锁的尝试。
这甚至可以在死锁实际发生的情况下检测死锁风险。如果一个线程先获取锁 A,然后获取锁 B,而另一个线程先获取锁 B,然后获取锁 A,则除非它们重叠,否则不会出现死锁。但这个方法可以检测出来。
高级死锁检测通常仅在调试期间使用。除了对应用程序进行编码以检查每个阻塞锁是否存在可能的死锁并知道发生死锁时该怎么做之外,死锁后您唯一能做的就是拆除应用程序。不能盲目释放锁,因为它们保护的资源可能处于不一致的状态。
有时,您故意编写明知可能导致死锁的代码,并专门对其进行编码以避免该问题。例如,如果您知道许多线程获取锁 A,然后尝试获取锁 B,而其他一些线程需要执行相反的操作,则可以对其进行编码,以非阻塞方式尝试锁定 B,并在失败时释放锁 A 。
通常,花精力避免死锁比让代码检测并解决死锁更有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)