我正在使用Boost.Unit编写单元测试,我想在我正在测试的代码中包含死锁的基本测试。我的第一个想法是在一个线程中设置一个截止时间计时器,同时在另一个线程中运行测试,预计在截止日期之前完成。当计时器熄灭时,断言线程没有运行或不可中断。我能以何种方式更精确地检测到死锁?
答案 0 :(得分:3)
一个问题是,您是否正在测试实际死锁(即查看是否发生了死锁)或潜在的死锁(即查看是否发生了死锁) ?
如果您只关心检测实际的死锁,那么您所描述的内容就可以了。但是,我不确定这一切是否有用,因为无论您运行多少次测试,如果线程间时间结束,将来总会有可能发生死锁。完全错了。这是一个多线程编程与单线程编程不同的领域:在多线程程序中,成功运行程序一次(甚至一百万次)并不能证明它是正确的。
保证代码不会死锁的唯一方法是验证每当线程一次拥有多个锁时,它们都以相同的顺序获取锁。最简单的方法是确保没有线程一次拥有多个锁,但这并不总是可行的。鉴于此,另一种方法是简单地关注代码,直到您已经证明自己满意为止在所有情况下都遵循单个锁定顺序。但这并不总是实用的,特别是如果代码很复杂的话。 (顺便说一句,将多线程代码尽可能地简单化,总是很好,正是出于这种原因)。
如果对代码的关注度不够,你可以做的最后一件事是检测你的锁定:最简单的方法(如果你的代码可以在Linux下运行)是在helgrind下运行你的代码。如果你不能这样做,另一种方法是将锁定/解锁调用包装在一个函数中,该函数记录哪个线程锁定/解锁哪个互斥锁,以及稍后解析日志以检测锁定顺序不一致“post mortem”