gpt4 book ai didi

c++ - boost C++ 库 : Unit Test Assertion on Deadlocks

转载 作者:行者123 更新时间:2023-11-28 01:10:17 24 4
gpt4 key购买 nike

我正在使用 Boost.Unit 编写单元测试,我想在我正在测试的代码中包含死锁的基本测试。我的第一个想法是在一个线程中设置一个截止日期计时器,同时在另一个线程中运行测试,该测试预计会在截止日期之前完成。当计时器关闭时,断言线程未运行或不可中断。我可以通过哪些方式更准确地检测死锁?

最佳答案

一个问题是,您是在测试实际死锁(即查看是否发生了死锁)还是潜在死锁(即查看是否可能发生死锁) ?

如果您只关心检测实际的死锁,那么像您描述的那样的东西就可以工作。但是,我不确定这是否有用,因为无论您运行测试多少次,如果线程间计时最终只是完全错了。这是多线程编程与单线程编程不同的地方:在多线程程序中,成功运行程序一次(甚至一百万次)并不能证明它是正确的。

保证您的代码不会死锁的唯一方法是验证每当线程同时持有多个锁时,它们都以相同的顺序获取锁。最简单的方法是确保没有线程一次持有多个锁,但这并不总是可行的。鉴于此,另一种方法是简单地观察代码,直到您满意地证明在所有情况下都遵循一个锁定顺序。但这也不总是实用的,尤其是在代码很复杂的情况下。 (顺便说一句,正是出于这种原因,让多线程代码尽可能地简单总是好的)。

如果只看代码还不够,那么您可以做的最后一件事就是检测您的锁获取:最简单的方法(如果您的代码可以在 Linux 下运行)是在 helgrind 下运行您的代码。如果你不能这样做,另一种方法是将你的锁定/解锁调用包装在一个函数中,该函数记录哪个线程正在锁定/解锁哪个互斥锁,然后解析日志以检测锁定顺序不一致的“事后分析” .

关于c++ - boost C++ 库 : Unit Test Assertion on Deadlocks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3792319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com