我正在使用Boost.Unit编写单元测试,并且我想在要测试的代码中包括死锁的基本测试。我的第一个想法是在一个线程中设置一个截止日期计时器,同时在另一个线程中运行测试,该测试有望在截止日期之前完成。当计时器关闭时,断言线程未运行或不可中断。我可以通过哪些方式更精确地检测死锁?
最佳答案
一个问题是,您是否正在测试实际的死锁(即查看是否发生死锁)或潜在的死锁(即查看是否可能发生死锁)?
如果您只关心检测实际的死锁,则可以像您描述的那样工作。但是,我不确定这是否会有用,因为无论您运行测试多少次,如果线程间计时最终结束,将来总会有死锁的可能性。完全错误。这是多线程编程与单线程编程不同的领域:在多线程程序中,成功运行该程序一次(甚至一百万次)并不能证明它是正确的。
保证代码不会死锁的唯一方法是验证每当线程一次持有多个锁时,它们都以相同的顺序获取锁。最简单的方法是确保一次没有一个线程拥有一个以上的锁,但这并不总是可能的。鉴于此,另一种方法是简单地盯着代码,直到您完全满意地证明在所有情况下都遵循单个锁定顺序为止。但这也不总是可行的,尤其是在代码复杂的情况下。 (顺便说一句,正是出于这种原因,使多线程代码尽可能地残酷简单总是好事)。
如果仅看一眼代码不足,那么您最后要做的就是检查您的锁定获取:最简单的方法(如果您的代码可以在Linux下运行)是在helgrind下运行代码。如果您不能执行此操作,则另一种方法是将锁定/解锁调用包装在一个函数中,该函数记录哪个线程正在锁定/解锁哪个互斥锁,然后解析该日志以检测锁定顺序不一致(“验尸”)。 。
关于c++ - Boost C++库:死锁的单元测试断言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3792319/