2010-09-25 72 views
0

我正在用Boost.Unit编写单元测试,并且我想在我测试的代码中包含死锁的基本测试。我的第一个想法是在一个线程中设置一个截止时间定时器,同时在另一个线程中运行测试,预计在截止日期前完成。当定时器关闭时,断言该线程没有运行或不可中断。我可以通过哪些方式更精确地检测死锁?Boost C++库:单元测试在死锁上的声明

回答

3

的一个问题是,你对测试实际死锁(即看是否死锁发生)或潜在死锁(即看是否死锁可能发生)?

如果你只关心检测实际的死锁,那么你所描述的东西可以工作。但是,我不确定这样做会有什么用处,因为无论您运行多少次测试,如果线程间定时结束,将来总有可能会发生死锁完全错误。这是一个多线程编程与单线程编程不同的领域:在多线程程序中,一次(甚至一百万次)成功运行程序并不能证明它是正确的。

保证您的代码不会死锁的唯一方法是验证每次线程同时拥有多个锁时,它们都以相同的顺序获得锁。最简单的方法是确保没有线程一次拥有多个锁,但这并非总是可行。鉴于此,另一种方法是直接对代码进行眼球检查,直至您确信自己的满意度,即所有情况下都遵循单一锁定顺序。但是这并不总是实际,特别是如果代码复杂。 (顺便说一句,将多线程代码尽可能简单地设置为非常简单,正是出于这种原因)。

如果目光明亮的代码是不够的,你可以做的最后一件事是仪器锁定采集:最简单的方法(如果你的代码可以在Linux下运行)是在helgrind下运行你的代码。如果你不能这样做,另一种方法是将你的锁/解锁调用包装在一个函数中,该函数记录哪个线程正在锁定/解锁哪个互斥锁,然后解析日志以检测锁定顺序不一致性“post mortem” 。