我已经看到了可以确定性地运行多线程程序的工具,即使在存在竞争条件的情况下也是如此。现在我想知道是否有任何工具可以实际检测到比赛并重写代码(在运行时)以便将来没有检测到的比赛。
这种工具是否存在?或者创建一个太难了?我认为它可以使用一个动态二进制代码转换工具创建,例如PIN或valgrind。
答案 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
工作此类工具的工作方式是,它们可以跟踪每次内存访问的锁定和其他信息,并维护以前访问的历史记录。每次访问都与之前访问的历史记录进行比较。还有更多。