我正在用Boost.Unit编写单元测试,并且我想在我测试的代码中包含死锁的基本测试。我的第一个想法是在一个线程中设置一个截止时间定时器,同时在另一个线程中运行测试,预计在截止日期前完成。当定时器关闭时,断言该线程没有运行或不可中断。我可以通过哪些方式更精确地检测死锁?Boost C++库:单元测试在死锁上的声明
0
A
回答
3
的一个问题是,你对测试实际死锁(即看是否死锁发生)或潜在死锁(即看是否死锁可能发生)?
如果你只关心检测实际的死锁,那么你所描述的东西可以工作。但是,我不确定这样做会有什么用处,因为无论您运行多少次测试,如果线程间定时结束,将来总有可能会发生死锁完全错误。这是一个多线程编程与单线程编程不同的领域:在多线程程序中,一次(甚至一百万次)成功运行程序并不能证明它是正确的。
保证您的代码不会死锁的唯一方法是验证每次线程同时拥有多个锁时,它们都以相同的顺序获得锁。最简单的方法是确保没有线程一次拥有多个锁,但这并非总是可行。鉴于此,另一种方法是直接对代码进行眼球检查,直至您确信自己的满意度,即所有情况下都遵循单一锁定顺序。但是这并不总是实际,特别是如果代码复杂。 (顺便说一句,将多线程代码尽可能简单地设置为非常简单,正是出于这种原因)。
如果目光明亮的代码是不够的,你可以做的最后一件事是仪器锁定采集:最简单的方法(如果你的代码可以在Linux下运行)是在helgrind下运行你的代码。如果你不能这样做,另一种方法是将你的锁/解锁调用包装在一个函数中,该函数记录哪个线程正在锁定/解锁哪个互斥锁,然后解析日志以检测锁定顺序不一致性“post mortem” 。
相关问题
- 1. x单元测试死锁
- 2. Boost C++库:%处理器使用情况下的单元测试声明
- 3. qt单元测试QTreeWidgetItem尚未声明
- 4. Python单元测试声明错误
- 5. 与Shouldly声明单元测试失败
- 6. Python单元测试条件声明
- 7. 如何检测Asio库的死锁?
- 8. 单元测试C#双锁模式
- 9. 如何测试回拨函数? (C++ Boost单元测试)
- 10. 属性跳过声明单元测试C#
- 11. 使用nUnit测试死锁
- 12. 声纳C单元测试框架
- 13. 在Visual Studio中执行单个Boost测试单元测试
- 14. 如何在Swift单元测试中声明可选Bool的值?
- 15. 如何在reactjs单元测试中声明正确的值?
- 16. 声明在角度单元测试中存在父组件
- 17. 锁定在单元测试不工作
- 18. 在单元测试中声明设置和预置条件
- 19. 如何在Groovy单元测试中声明响应成功
- 20. C#单元测试
- 21. C#单元测试
- 22. C#单元测试
- 23. 单元测试(C#)
- 24. 线程同步(锁)的单元测试
- 25. 在solaris上的C++的死锁
- 26. 我可以在Nunit中创建数据库死锁测试吗?
- 27. 单元测试示例证明单元测试值得一写
- 28. 课堂扩展中声明的单元测试方法
- 29. .Net MVC中的单元测试声明应用程序
- 30. C#中的单元测试#