什么是死锁和如何防止他们在软件开发?

软件作者同时处理多个任务时,可以使用多线程programming-programs等构造多个入口点,交错的线程和异步中断。然而,多线程编程是高度复杂的,介绍了微妙的缺陷等数据竞争和死锁。这种缺陷发生时,它可以需要很长时间才能重现这个问题,甚至更长的时间来确定问题的根源和解决它。

死锁是这一类中最细微的缺陷之一。死锁发生在多个任务或线程无法取得进展,因为每个任务正在等待另一个任务,也是持有的锁卡住了。

死锁的例子

假设两个任务,任务1任务2将值写入共享资源,sharedVar1sharedVar2。写操作保护有两个互斥锁,互斥# 1互斥# 2,在序列。值得注意的一件重要事情是,收购锁的顺序是相反的两个任务。

两个任务要在共享资源

你可以看到这个完整代码示例检查细节。

如果你构建和运行这段代码,在运行时执行冻结零星。下面的示例显示程序执行几次,第八次运行,控制台就停止响应。

程序冻结在执行跟踪代码中的死锁。死锁的结果在这个序列当发生以下事件:

  1. 任务1的锁互斥# 1并持续的地步互斥# 2需要获得。
  2. 执行切换到任务2首次获得锁互斥# 2。然后任务2持续的地步互斥# 1需要获得。

在这一点上,任务2正在等待任务1释放互斥# 1,而任务1正在等待任务2释放互斥# 2。无论是任务能够继续过去的这个状态和释放锁所需的其他任务。这种情况就是一个典型的例子一个僵局。

由于死锁严格取决于指令的执行顺序,你可能不会在每次运行。如果存在死锁的可能性在你的程序,你会偶尔遇到程序冻结令人费解。因为零星的性质这一问题,死锁可以逃脱未被发现在正常测试。即使发现,死锁有时很难繁殖,使它们看起来像一个Heisenbug一个错误,似乎消失在审查。

如何检测和解决死锁

与动态测试,静态分析工具分析程序的结构,可以涵盖各式各样的执行情况。死锁像前面的检测在一个运行的静态分析工具。

在下面的示例中,我们使用了并发跳棋的静态分析工具,Polyspace错误发现者,在以前的项目。不仅工具检测到死锁,但是它还提供了序列的指令,导致死锁。

僵局审查程序流

在事件列表中,每一项伴随死锁是可点击的,带你到相关位置的代码。的帮助下,你可以导航到点锁获得了解死锁发生。

有很多方法可以解决死锁。在上一个示例中,您可以通过简单地解决僵局扭转的顺序锁获得的任务。例如,任务2可以获得互斥# 1首先,然后互斥# 2并释放他们按照相反的顺序(就像任务1)。一般来说,如果两个以上参与死锁锁循环,您可以设置一个固定的收购锁的订单,确保订单中观察到的所有任务。然而,这种方法还需要仔细考虑程序的逻辑,可能会在任何条件下都不可能。

另一个修复可以阻止一些任务开始其他任务运行时通过将优先分配给的任务。实现修复之后,您可以看到僵局解决如果你的静态分析工具支持任务优先级。金宝app您可以设置Polyspace错误发现者承认某些任务比其他人有更高的优先级。

总结

不管修复是什么,第一步是检测死锁的存在。简单的动态测试不能做这项工作。你需要用一种先进的静态分析工具,可以识别多线程编程的各种概念和检测相关问题并行执行模型。

Polyspace错误发现者有大量并发检查可探测的位置锁的问题,如死锁、双锁,和未解决的比赛数据。更多的例子,请参阅并发缺陷Polyspace错误发现者

写的Yoo Yong-chul和Anirban Gangopadhyay。

Yoo Yong-chul MathWorks韩国作为应用工程师工作,负责代码验证产品。下载188bet金宝搏

Anirban Gangopadhyay作为文档作家MathWorks我们。他负责技术文档Polyspace®下载188bet金宝搏产品。

原来的帖子:Naver的博客

MathWorks韩国2020.5.19