如何故意在测试用例中造成死锁,以稳定地保护并发 bug?

how to deliberately cause deadlock in test cases to guard concurrent bug steadily?

提问人:Lewis Chan 提问时间:11/2/2023 更新时间:11/2/2023 访问量:53

问:

想象一下,我有一个复杂的测试用例,偶尔会导致两个线程死锁。我认为,在 CI 中运行以保护并发错误是不合适的。我想编写一个简单的测试用例,根据线程的堆栈跟踪,以非常高的可能性导致死锁。

但是,由于操作系统中的线程调度,在我的情况下仍然很难重现死锁。我如何确保死锁几乎总是发生在我的情况下,直到错误被修复? 我不知道是否有一些技巧可以实现它,例如更改操作系统参数、设置特定的屈服点或睡眠点。

c pthreads 数据库死锁

评论

0赞 greg spears 11/2/2023
这是什么操作系统?
1赞 Simon Goater 11/2/2023
您应该确定死锁的性质。它是在等待文件、数据库资源、互斥锁还是其他东西?
2赞 John Bollinger 11/2/2023
您似乎希望使现有代码中的特定死锁方案持续触发。可能有也可能没有一个简单的解决方案,但任何成功方法的细节都将在很大程度上取决于你的代码。通常,我会要求一个最小的可重复示例。我理解可能无法为像您这样的情况制作一个,但这只是意味着 SO 不是这个问题的合适场所。
2赞 Andrew Henle 11/2/2023
如果你的任务是创建测试来查找所有可能的死锁场景,以便以不包括创建定义的锁定顺序并强制执行它的方式修复它们,那么你的任务就加倍无望了。在任何复杂的系统中,几乎不可能测试所有可能的死锁场景 - 当涉及许多线程时,时序组合太多了。然后,如果不修复在没有指定顺序的情况下获取锁的基本损坏性质,就不可能可靠地修复您发现的任何场景。
1赞 greg spears 11/3/2023
@Lewis Chan -- 嗨 -- 你可能知道,根据社区的评论,我已经删除了我的答案。如果您发现它的任何部分有用,代码就在这里。干杯。。。

答: 暂无答案