有什么方法可以检测Linux上的竞争条件?

时间:2011-11-05 18:38:32

标签: c linux gcc x86 valgrind

您使用了哪些工具来检测Linux中多线程程序的竞争条件。

我使用 valgrind 中的 helgrind 工具,但我注意到有时它会错过竞争条件。

3 个答案:

答案 0 :(得分:2)

您可以尝试ThreadSanitizer

来自Helgrind的differs,在混合模式下,它“可能会产生更多误报,但更快,更可预测,并发现更真实的种族。”

答案 1 :(得分:1)

编辑我错过了你提到的helgrind。但是,在我的文中有一些指示,指出为什么helgrind可能会错过这种情况。

您可以使用valgrind工具包中的 helgrind

  

Helgrind是一个Valgrind工具,用于检测使用POSIX pthreads线程原语的C,C ++和Fortran程序中的同步错误。

     

POSIX pthreads中的主要抽象是:一组共享公共地址空间的线程,线程创建,线程连接,线程退出,互斥(锁),条件变量(线程间事件通知),读写器锁,自旋锁,信号量和障碍。

     

Helgrind可以检测到三类错误,这些错误将在接下来的三个部分中详细讨论:

     
      
  1. Misuses of the POSIX pthreads API

  2.   
  3. Potential deadlocks arising from lock ordering problems

  4.   
  5. Data races -- accessing memory without adequate locking or synchronisation

  6.   

这些问题经常会导致无法重现的,与时间相关的崩溃,死锁和其他不当行为,并且很难通过其他方式找到。

Helgrind知道所有的pthread抽象并尽可能准确地跟踪它们的效果。在x86和amd64平台上,它理解并部分处理因使用LOCK指令前缀而产生的隐式锁定。

当您的应用程序仅使用POSIX pthreads API时,Helgrind效果最佳。但是,如果要使用自定义线程原语,可以使用helgrind.h中定义的ANNOTATE_ *宏来描述它们对Helgrind的行为。此功能已在Valgrind 3.5.0版中添加,并被视为实验性的。

答案 2 :(得分:1)

您还可以使用 DRD Valgrind工具以及 helgrind 。虽然我没有尝试 DRD ,但它应该检测到 helgrind 错过的一些错误 - 所以值得使用这两种工具来检测更多错误。