是否有任何工具可以在运行时检测竞争条件并重写代码以避免将来使用它们

时间:2012-06-04 09:48:57

标签: c linux race-condition

我已经看到了可以确定性地运行多线程程序的工具,即使在存在竞争条件的情况下也是如此。现在我想知道是否有任何工具可以实际检测到比赛并重写代码(在运行时)以便将来没有检测到的比赛。

这种工具是否存在?或者创建一个太难了?我认为它可以使用一个动态二进制代码转换工具创建,例如PIN或valgrind。

2 个答案:

答案 0 :(得分:5)

A race condition表示计算结果取决于事件发生的时间(中断,调度程序等)。开发人员通常意味着什么(我认为你也意味着什么)是程序在大多数情况下是“正确的”,有时只会失败 - 由竞争条件引发的错误很少发生。< / p>

一些自动检测算法如何知道什么是期望的结果,什么不是? 即使它可以做到这一点:知道它发生了,弄清楚如何然后修复它通常会更加困难。我相信你可以将这个问题减少到halting problem

在工作中,我们已经开始使用一些框架,这些框架允许创建单元测试以检测竞争条件(我可以看一下当我重新开始工作时所称的),但它基于枚举所有可能的线程计划。作为一个简单的测试,我们让它在并发队列实现上运行,具有1个消费者和1个生产者的测试用例以及1的队列容量需要几秒钟才能运行。只需将队列容量增加到2就可以运行几天。可能是工具不太好但它显示了可能的组合数量爆炸非常快。

答案 1 :(得分:2)

虽然以确定的方式运行程序太多了,但要检测一些(如果不是全部)竞争条件并不困难。

目前正在该领域进行大量研究。

,你走在正确的轨道上

PIN -------&gt;英特尔Parallel Studio Valgrind - &gt; Cachegrind和ThreadSanitizer 1.0

有许多开源和商业工具。我曾经在1

工作

此类工具的工作方式是,它们可以跟踪每次内存访问的锁定和其他信息,并维护以前访问的历史记录。每次访问都与之前访问的历史记录进行比较。还有更多。