0

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

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

4

2 回答 2

5

竞争条件意味着您的计算结果取决于事件发生的时间(中断、调度程序等)。开发人员通常的意思(我假设你也是这个意思)是程序大部分时间都是“正确的”,只是有时会失败——一个由竞争条件触发的错误,这种情况很少发生。

一些自动检测算法应该如何知道期望的结果是什么,什么不是?即使它可以做到这一点:知道它发生并弄清楚如何然后修复它通常要困难得多。我相信您可以将此问题简化为停机问题

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

于 2012-06-04T10:17:36.347 回答
2

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

目前该领域正在进行大量研究。你走在正确的轨道上

PIN -------> Intel Parallel Studio Valgrind --> Cachegrind 和 ThreadSanitizer 1.0

有许多开源和商业工具。我以前工作过 1

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

于 2012-06-10T06:59:12.167 回答