我应该使用Helgrind还是DRD进行线程错误检测?

看起来Valgrind有两个工具都可以进行线程错误检测: Helgrind和DRD 。 这些工具基本相似。

我的主要问题是:我何时应该使用一个而不是另一个来检查我的multithreading代码?

更广泛地说,为什么有两种工具? 我认为它们并非完全多余。 有什么重要的区别? 我是否应该计划通过这两种工具运行我的代码?

虽然Helgrind可以检测到锁定顺序违规,但对于大多数程序,DRD需要较少的内存来执行其分析。 此外,DRD支持分离线程。 还有更微妙的差异 – 如果您想了解更多,请比较相应的手册。 另见http://valgrind.org/docs/manual/hg-manual.html和http://valgrind.org/docs/manual/drd-manual.html 。

如果您使用除互斥体之外的任何POSIX同步原语(例如,信号量,障碍,条件变量等),DRD值得运行 – 它可以识别Helgrind未检测到的一些微妙的错误。

但是,DRD似乎比Helgrind更耗费资源(在我使用3.14.0的运行中似乎有大量的CPU开销)。

我何时应该使用一个而不是另一个来检查我的multithreading代码?

取决于您要检查该代码的内容。

要检查数据争用,您可能需要使用ThreadSanitizer 。
与DRD和其他人比较 。

还有一点要考虑:从valgrind版本3.6.0开始,DRD支持pthread螺旋锁,但helgrind不支持。 我没有试过3.7.0,但发行说明让我相信这没有改变。