寻找线程错误

时间:2010-06-23 07:42:07

标签: c++ multithreading

在编译时试图找到线程问题是否有任何意义?

我在谈论数据竞争,死锁,破坏状态等......

3 个答案:

答案 0 :(得分:4)

虽然这不是编译时间,但您可能需要查看Helgrind

  

<强>概述

     

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

     

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

     

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

     
      
  1. 错误使用POSIX pthreads API。
  2.   
  3. 锁定排序问题引起的潜在死锁。
  4.   
  5. 数据竞赛 - 没有足够的锁定或访问内存   同步。
  6.         

    这些问题经常导致   不可再现的,与时间有关的   崩溃,死锁等   行为不端,可能很难   通过其他方式找到。

         

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

         

    Helgrind在你的时候效果最好   应用程序仅使用POSIX   pthreads API。但是,如果你愿意的话   你可以使用自定义线程原语   可以描述他们的行为   Helgrind使用ANNOTATE_ *宏   在helgrind.h中定义。这个   在发布中添加了功能   Valgrind的3.5.0,被认为是实验性的。

由于Boost.Threads基于POSIX pthreads(至少在Linux上),我猜它也适用于它。

答案 1 :(得分:2)

虽然我不知道任何具有显式线程安全诊断选项的编译器,但Coverity是静态分析工具,它确实为并发问题提供了检查器,而这些问题在运行时没有完成松散可比性到“编译时”,因为编译器是一个工具,在生成代码之前对来的有效性做了一些静态分析,这似乎是你正在寻找的,不一定与编译时相关联,即在生成代码之前......

如果静态分析工具理解并发原语,则可以对线程问题进行静态分析。无论工具/编译器是否正确地指出了这些问题,我仍然需要经历。

注意:在工作中我们使用Coverity进行静态分析,但是当我们浏览工具指出的所有“问题”时,我们还没有启用并发检查器,因此我无法提供任何有关其工作原理的证明。至于其他更常见的检查员,他们指出了一堆有效的问题,以及一些无害的问题,以及一些误报。我希望尽快检查并发检查器的输出,以判断自己的用处。

答案 2 :(得分:1)

例如,您可能需要查看http://software.intel.com/en-us/articles/debugging-threaded-applications/。有专门用于此任务的软件,如http://software.intel.com/en-us/intel-thread-checker/

编辑:抱歉,没有看到您要求编译时解决方案。也许这个答案仍然具有相关性。