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

标签 c linux race-condition

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

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

最佳答案

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

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

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

关于c - 是否有任何工具可以在运行时检测竞争条件并重写代码以避免将来出现它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10879342/

相关文章:

c - 为什么编译器会忽略 OpenMP 编译指示?

c - 警告 : passing argument ’from incompatible pointer type [enabled by default]'

在c中创建动态数组

c - 将字符串的内容解析为子字符串

linux - Linux 中的 J4L ocr 设置

Linux cmd将文件复制到现有文件而不覆盖它

c - 使用 GCC 驱动程序时,什么使静态库成为 "incompatible"?

android - NDK从 native 代码调用函数

C使用管道传输数据以使用共享内存写入文件

c - OpenCL 与 printf 的竞争条件?