看起来 Valgrind 有两个工具都可以检测线程错误: Helgrind 和 DRD。这两个工具在很大程度上是相似的。 我的主要问题是:在检查我的多线程代码时,我应该何时使用其中一个工具而不是另一个工具呢? 更广泛地说,为什么会有两个工具? 我假设它们并不完全冗余。 重要的区别是什么? 我通常应该计划通过这两个工具运行我的代码吗?
虽然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开销非常大)。